0223-leetcode-28.找出字符串中第一个匹配项的下标、243.有效的字母异位词

28.找出字符串中第一个匹配项的下标

题目

给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

提示:

  • 1 <= haystack.length, needle.length <= 104
  • haystackneedle 仅由小写英文字符组成

方法一、使用JS中的封装函数indexOf

indexOf 方法是 JavaScript 中字符串和数组对象的一个内置方法,用于查找一个值在给定数组或字符串中首次出现的位置。如果没有找到该值,则返回 -1。以下是 indexOf 方法的详细信息:

数组中的 indexOf

语法

array.indexOf(searchElement[, fromIndex])

参数

  • searchElement:需要查找的元素。

  • fromIndex(可选):开始查找的位置。如果该索引值大于或等于数组长度,则返回 -1。如果为负值,则从数组的末尾开始向前查找,即 -1 表示从最后一个元素开始查找,-2 表示从倒数第二个元素开始查找,以此类推。

返回值

返回在数组中找到 searchElement 的第一个索引,如果不存在,则返回 -1。

示例

const array = [2, 5, 9];
console.log(array.indexOf(2)); // 输出:0
console.log(array.indexOf(7)); // 输出:-1
console.log(array.indexOf(9, 2)); // 输出:2
console.log(array.indexOf(2, -1)); // 输出:-1,因为从倒数第一个元素开始查找,找不到2
console.log(array.indexOf(5, -3)); // 输出:1,因为从倒数第三个元素开始查找,即从第一个元素开始查找

字符串中的 indexOf

语法

string.indexOf(searchValue[, fromIndex])

参数

  • searchValue:需要查找的字符串。
  • fromIndex(可选):开始查找的位置。如果该索引值大于或等于字符串长度,则返回 -1。如果为负值,则从字符串的末尾开始向前查找。

返回值

返回 searchValue 在字符串中首次出现的位置的索引,如果不存在,则返回 -1。

示例

const str = "Hello world!";
console.log(str.indexOf("Hello")); // 输出:0
console.log(str.indexOf("world")); // 输出:6
console.log(str.indexOf("o")); // 输出:4,因为返回第一次出现的位置
console.log(str.indexOf("o", 5)); // 输出:7,从索引5开始查找
console.log(str.indexOf("bye")); // 输出:-1,因为字符串中不存在 "bye"

indexOf 方法在处理字符串和数组时非常有用,尤其是在需要确定某个值是否存在或者需要找到特定值的位置时。需要注意的是,indexOf 方法在比较值时使用的是严格相等(===),这意味着不会进行类型转换。

代码

var strStr = function(haystack, needle) {// 如果 needle 是空字符串,根据题目要求,返回 0if (needle === "") {return 0;}// 使用 indexOf 方法查找 needle 在 haystack 中的位置return haystack.indexOf(needle);};

方法二、通过字符串比较

通过字符串比较来找到子字符串 needle 在字符串 haystack 中的第一个匹配项的下标,而不使用 indexOf 方法,可以手动实现一个类似的逻辑。

1.比较在haystack中和needle长度相同的字符串

2.从当前索引到长度相同的位置 一一比较即可,也就是haystack中找当前索引0到haytack-neddle长度的位置为起始比较点。

3.对于needle,从haystack中的i+j位置开始挨个比较。只要出现不同的就停止 证明这一段肯定不相同。

function strStr(haystack, needle) {// 如果 needle 是空字符串,根据题目要求,返回 0if (needle === "") {return 0;}// 获取 haystack 和 needle 的长度const haystackLength = haystack.length;const needleLength = needle.length;// 只需要遍历到 haystack 剩余长度等于 needle 长度的位置for (let i = 0; i <= haystackLength - needleLength; i++) {// 检查从当前索引开始的子字符串是否与 needle 相同let match = true;for (let j = 0; j < needleLength; j++) {if (haystack[i + j] !== needle[j]) {match = false;break;}}// 如果找到匹配的子字符串,返回当前索引if (match) {return i;}}// 如果没有找到匹配项,返回 -1return -1;
}// 示例 1
console.log(strStr("sadbutsad", "sad")); // 输出:0// 示例 2
console.log(strStr("leetcode", "leeto")); // 输出:-1

方法三、通过数组比较

  1. 将 haystack 和 needle 都转换为字符数组。
  2. 遍历 haystack 数组,对于每个字符,检查它是否是 needle 数组的第一个字符。
  3. 如果找到匹配的字符,检查 haystack 中从当前位置开始的子数组是否与 needle 数组相同。
  4. 如果找到完全匹配的子数组,返回当前索引。
  5. 如果遍历完 haystack 都没有找到匹配的子数组,返回 -1。
function strStr(haystack, needle) {// 如果 needle 是空字符串,返回 0if (needle === "") return 0;// 将 haystack 和 needle 转换为字符数组const haystackArr = haystack.split('');const needleArr = needle.split('');// 遍历 haystack 数组for (let i = 0; i <= haystackArr.length - needleArr.length; i++) {// 检查从当前位置开始的子数组是否与 needleArr 相同if (haystackArr.slice(i, i + needleArr.length).join('') === needleArr.join('')) {return i; // 找到匹配,返回当前索引}}// 没有找到匹配,返回 -1return -1;
}// 示例 1
console.log(strStr("sadbutsad", "sad")); // 输出:0// 示例 2
console.log(strStr("leetcode", "leeto")); // 输出:-1

243.有效的字母异位词

题目

给定两个字符串 st ,编写一个函数来判断 t 是否是 s

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • st 仅包含小写字母

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况? 

方法一、排序

如果s和t中的元素是相同的 只要对他们进行排序 然后判断相等与否 如果相同 就是字母异位词 如果不同就不是

  1. 首先将字符串 s 和 t 分别转换为字符数组。
  2. 然后,您对这两个数组进行排序。
  3. 排序后,您将数组转换回字符串。
  4. 最后,您比较这两个排序后的字符串是否相等。
var isAnagram = function(s, t) {// //一、排序StrS=s.split('').sort().join('');StrT=t.split('').sort().join('');if(StrS===StrT) return true;else return false;
};

可以将字符串转换为字符数组,然后比较这两个数组是否相等。

  1. 创建字符数组,但并没有将它们转换回字符串。
  2. 使用 every 方法和数组的索引来比较排序后的数组的每个元素。

这种方法同样具有 O(n log n) 的时间复杂度,但是由于没有将数组转换回字符串,它可能稍微节省了一些时间和内存。

function areCharCountsEqual(s, t) {const sArray = Array.from(s).sort();const tArray = Array.from(t).sort();return sArray.length === tArray.length && sArray.every((value, index) => value === tArray[index]);
}

 

方法二、统计字母出现次数

统计s中每个元素出现的个数,在对t进行遍历,若存在这个元素则将这个元素减一,当t中有这个元素,但是count数组中却没有(包括count[char]为0和undefined),这种情况下返回false。

var isAnagram = function(s, t) {//二、统计字母出现次数// 如果两个字符串长度不同,它们不可能是字母异位词if (s.length !== t.length) {return false;}// 创建一个对象来统计字符出现的次数let count = {};//计算s和t中每个字符出现的次数for(let char of s){count[char]=(count[char]||0)+1;}for(let char of t){// if(count[char]===undefined||count[char]===0) return false;if(!count[char]) return false;count[char]--;// if(count[char]===-1) return false;}return true;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22962.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】Unet的基础介绍

U-Net是一种用于图像分割的深度学习模型&#xff0c;特别适合医学影像和其他需要分割细节的任务。如图&#xff1a; Unet论文原文 为什么叫U-Net&#xff1f; U-Net的结构像字母“U”&#xff0c;所以得名。它的结构由两个主要部分组成&#xff1a; 下采样&#xff08;编码…

【学习笔记】Cadence电子设计全流程(二)原理图库的创建与设计(8-15)

【学习笔记】Cadence电子设计全流程&#xff08;二&#xff09;原理图库的创建与设计&#xff08;下&#xff09; 2.8 Cadence 软件自带元件库2.9 原理图元器件关联PCB2.10 原理图元器件库的移植2.11 已有原理图输出元器件库2.12 原理图设计中调用元器件库2.13 原理图元器件库关…

DeepSeek从入门到精通

1_DeepSeek从入门到精通 (1).pdf官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供1_DeepSeek从入门到精通 (1).pdf最新版正式版官方版绿色版下载,1_DeepSeek从入门到精通 (1).pdf安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123…

Comfyui Windows Desktop桌面版便携版安装教程

前段时间Comfyui 的便携包安装写了一篇&#xff0c;最近comfyui发布了新的桌面版本0.4.5&#xff0c;我也试着安装了一下&#xff0c;感觉使用体验比便携包要舒适一点点。 下面是安装指南。 安装地址 官方给了下载包&#xff0c;分为N卡和Mac。地址&#xff1a;Notion – Th…

DeepSeek 提示词:定义、作用、分类与设计原则

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

【Linux网络编程】数据链路层和网络层的几个问题:MTU,校验和,全球网段,路由表

目录 1.MTU 2.CRC校验和 3.全球网段 4.子网掩码 5.路由 1.MTU MTU是以太网的最大传输单位&#xff0c;大小是1500字节&#xff0c;表示IP&#xff08;网络层传下来的最多只能1500字节&#xff09;。 如果超过了这个数&#xff0c;就要网络层自己做分包。数据链路层是不帮…

浅谈死锁的原因以及解决方案

目录 1 死锁是什么? 2 死锁的三种典型情况 3 死锁产生的必要条件​编辑 4 如何解决死锁问题 1 死锁是什么? 它是指两个或多个线程因为互相等待对方持有的资源而无法继续执行的情况。换句话说&#xff0c;每个线程都在等待另一个线程释放资源&#xff0c;但没有任何一个…

【STM32】内存管理

【STM32】内存管理 文章目录 【STM32】内存管理1、内存管理简介疑问&#xff1a;为啥不用标准的 C 库自带的内存管理算法&#xff1f;2、分块式内存管理&#xff08;掌握&#xff09;分配方向分配原理释放原理分块内存管理 管理内存情况 3、内存管理使用&#xff08;掌握&#…

【SpringMVC】十分钟跑起来一个SpringMVC项目

目录标题 1 项目概述1.项目结构解析2. MVC项目的结构和每个组件的作用&#xff1a;3. 项目的工作流程&#xff1a;4 后期可以扩展的点&#xff1a;2.源码学习1. HelloController 类&#xff0c;Spring MVC控制器2 springmvc-servlet.xml - Spring MVC的主要配置文件3.web 目录 …

【复习】计算机网络

网络模型 OSI 应用层&#xff1a;给应用程序提供统一的接口表示层&#xff1a;把数据转换成兼容另一个系统能识别的格式会话层&#xff1a;负责建立、管理、终止表示层实体之间的通信会话传输层&#xff1a;负责端到端的数据传输网络层&#xff1a;负责数据的路由、转发、分片…

2025年- G17-Lc91-409.最长回文-java版

1.题目描述 2.思路 思路1: 判断一个字符串中的字母个数是否是偶数个。 遍历字符串&#xff0c;检查每个字符是否是字母&#xff08;可以通过 Character.isLetter() 来判断&#xff09;。 累加字母的个数。 最后判断字母的个数是否是偶数。 思路2: 这段 Java 代码的作用是 统…

本地安装 Grafana Loki

本地安装 Grafana Loki 一、 安装 Loki1. 下载 Loki2. 创建 Loki 配置文件3. 创建 Loki 服务 二、安装 Promtail1. 下载 Promtail2. 创建 Promtail 配置文件3. 创建 Promtail 服务 三、 安装 Grafana四、启动所有服务五、添加loki 数据源1. 添加仪表板2. 日志查询面板 json 参考…

创建虚拟环境以及配置对应的项目依赖

文章目录 首先创建一个虚拟环境&#xff0c;创建一个名字为myenv,并且版本为xxx的虚拟环境 conda create --name myenv pythonxxx激活虚拟环境 conda activate myenv下载所需的依赖&#xff0c;如果有requirements.txt文件 pip install -r requirements.txt容易出现的错误&a…

W803|联盛德|WM IoT SDK2.X测试|(1)开箱:开发板及说明

前几天关注的联盛德微电子新推出了WM IoT SDK2.X&#xff0c;正式发布后&#xff0c;邀请用户参加“免费试用&#xff0c;赢千元大礼”活动&#xff0c;填写信息&#xff0c;等待统一发送&#xff0c;很快收到了板子。 活动地址&#xff1a;联盛德微电子WM IoT SDK2.X正式发布…

SSI用量子计算来玩AI

刚到家&#xff0c;早上说今天回来要写SSI为什么这么牛B&#xff0c;那就必须得写 SSI是什么公司&#xff1f; Safe Super Intelligence 就是中间这个秃子的公司 ilya 前openAI 首席科学家(现在的mark chen确实有点水) Daniel Gross、Ilya Sutskever、Daniel Levy&#xff…

【分布式数据一致性算法】Gossip协议详解

在分布式系统中&#xff0c;多个节点同时提供服务时&#xff0c;数据一致性是核心挑战。在多个节点中&#xff0c;若其中一个节点的数据发生了修改&#xff0c;其他节点的数据都要进行同步。 一种比较简单粗暴的方法就是 集中式发散消息&#xff0c;简单来说就是一个主节点同时…

文档检索服务平台

文档检索服务平台是基于Elasticsearch的全文检索&#xff0c;包含数据采集、数据清洗、数据转换、数据检索等模块。 项目地址&#xff1a;Github、国内Gitee 演示地址&#xff1a;http://silianpan.cn/gdss/ 以下是演示角色和账号&#xff08;密码同账号&#xff09;&#xf…

【YOLOv8】YOLOv8改进系列(2)----替换主干网络之FasterNet(CVPR 2023)

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;YOLOv8入门改进专栏&#x1f341; &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 【YOLOv8改进系列】&#xff1a; 【YOLOv8】YOLOv8结构解读…

Linux信号

目录 1. 信号的概念搞定&#xff08;输出结论&#xff0c;支撑我们的理解&#xff09; 补充知识 2.信号的产生 补充知识 3.信号的保存 4.阻塞信号 1. 信号其他相关常见概念 2. 在内核中的表示 3. sigset_t 4. 信号集操作函数 sigprocmask sigpending 5. 信号的…

NI Multisim仿真实现39计数器

功能需求 39进制计数器。 功能分析 &#xff08;1&#xff09;时钟信号产生电路&#xff1a;用555定时器产生时钟脉冲 2&#xff09;计数器&#xff1a; 用两片74160先串接起来构成一个百进制计数器&#xff1b;再用置数法接成39进制计数器。&#xff08;可用开关控制计数器…