28. 找出字符串中第一个匹配项的下标
题目描述
给你两个字符串 haystack
和 needle
,请你在 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
haystack
和needle
仅由小写英文字符组成
题解
看到这个题我的第一想法就是KMP算法
暴力算法
暴力算法应该是最容易想到的算法,算法比较简单,我用下图来表示,要查找leetcode
串中tco
的开始索引位置。
通常主串(leetcode
)叫做文本串,字串tco
被叫做模式串,上图的做法就是循环文本串,判断文本串当前索引开始,后面是否一一都与模式串匹配,如果匹配,那就返回文本串开始匹配的索引位置,如果出现不匹配,则本次匹配结束,文本串继续向后移动一个位置,继续匹配,算法也很简单,如下:
class Solution {
public int strStr(String text, String pattern) {
int n = text.length();
int m = pattern.length();
for (int i = 0; i <= n - m; i++) {
int j = 0;
while (j < m) {
if (text.charAt(i + j) != pattern.charAt(j)) {
break;
}
j++;
}
if (j == m) {
return i;
}
}
return -1;
}
}
文本串循环的时候,条件
i <= n - m
是很有必要的,因为如果文本串当前位置到尾部的长度如果都不如模式串长了,那么也就无需循环比较了,必然不会匹配的。
提交结果:
时间复杂度是
O(mn)
,其中m是模式串的长度,n是文本串的长度,空间复杂度是O(1)
。
RK算法
请查看文章===> RK算法
未完待续