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

1. 题目

给你两个字符串 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 仅由小写英文字符组成

2. 思路

  • 将目标haystackneedle字符串直接转换为字符数组
  • 开设一个新方法match用于匹配needle是否位于haystack的指定下标startIndex
  • match方法将从startIndex下标开始比较haystack中的字符是否与needle一致
    • 当遍历过程中发现任何一个字符不匹配,则match方法返回false
    • 如果完成遍历,则match方法返回true
  • 在主方法中遍历所有的haystack下标,并调用match方法进行判断,当match方法能完成匹配时,则直接返回进行匹配的startIndex

3. 代码

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
class Solution {
public int strStr(String haystack, String needle) {
var haystackCh = haystack.toCharArray();
var needleCh = needle.toCharArray();

for (var i = 0; i < haystackCh.length; ++i) {
if (match(haystackCh, needleCh, i)) {
return i;
}
}

return -1;
}

private boolean match(char[] c1, char[] c2, int startIndex) {
var i = startIndex;
var j = 0;
while (i < c1.length && j < c2.length) {
if (c1[i] != c2[j]) {
return false;
}
i++;
j++;
}

return j == c2.length;
}
}

4. 复杂度

  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n + m)

image-20230807102801269