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

题目

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

示例 1:

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

示例 2:

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

提示:

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

题解

今天时间超过百分百,哼,叉会儿腰~hhhhhh。

其实思路还是比较简单的,遍历haystack数组,如果当前lenHay - i < lenHay的话,说明剩余字符串比needle短,自然匹配不到,可以提前结束;然后比较当前的i处和needle[0],如果第一个字符相同了,就比较后面的,如果一直到needle末尾都相同,那么就可以返回i,就找到了;否则就是没找到,代码里注释应该还是比较清晰的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public int strStr(String haystack, String needle) {

int lenHay = haystack.length();
int lenNeedle = needle.length();
// 遍历haystack数组,第一个字符相同的时候开始进行比较后面的字符
for (int i = 0; i < lenHay; i++) {
// 如果剩下的长度小于needle,就说明不会有匹配的,返回即可
if (lenHay - i < lenNeedle) {
return -1;
}
// 如果第一个相同了,就往后面比较,不然就继续往后查询
if (haystack.charAt(i) == needle.charAt(0)) {
int j = i + 1;
// 比较后面的
while (j - i < lenNeedle) {
// 不相同了就说明比较失败了,中断循环,然后i从失败的位置重新开始;相同就继续比较
if (haystack.charAt(j) != needle.charAt(j - i)) {
break;
} else {
j++;
}
}
// 如果j大于等于needle的长度,就说明找到了,返回i就行,不然就是没找到中断循环
if (j - i >= lenNeedle) {
return i;
}
}
}
// 找了一圈没找到就是没有
return -1;
}
}

LeetCode-28-找出字符串中第一个匹配项的下标
https://excelius.xyz/leetcode-28-找出字符串中第一个匹配项的下标/
作者
Ther
发布于
2024年6月15日
许可协议