28.实现 strStr()
- 给你两个字符串
haystack
和needle
- 请你在
haystack
字符串中找出needle
字符串出现的第一个位置(下标从0
开始)。- 如果不存在,则返回
-1
。- 当
needle
是空字符串(无论haystack
是否为空)时,返回0
。- 当
haystack
是空字符串时,返回-1
。
方法一:暴力破解
我们可以让字符串 needle
与字符串 haystack
的所有长度为 m
的子串均匹配一次。
为了减少不必要的匹配,我们每次匹配失败即立刻停止当前子串的匹配,对下一个子串继续匹配。如果当前子串匹配成功,我们返回当前子串的开始位置即可。如果所有子串都匹配失败,则返回 -1
。
int strStr(string haystack, string needle) {
int nHSize = haystack.size(), nNSize = needle.size();
if (nNSize == 0) return 0;
if (nHSize == 0) return -1;
//记录 needle 在 haystack 中出现的第一个位置
int nRes = 0;
while (nRes <= nHSize - nNSize) {
//从 nRes 的位置开始判断 nNSize 个元素是否相等
for (int i = 0; i < nNSize; i++) {
//当判断到needle最后一个字符时,说明前面的字符都相等
//最后一个字符还相等的话,则在 haystack 中找出 needle
if (i == nNSize - 1) {
if (haystack[nRes + i] == needle[i]) {
return nRes;
}
}
if (haystack[nRes + i] != needle[i]) {
break;
}
}
nRes++;
}
return -1;
}
时间复杂度: O ( n × m ) O(n \times m) O(n×m)、空间复杂度: O ( 1 ) O(1) O(1)
LeetCode上的题解借助一个布尔变量 false
来判断是否在 haystack
中找到 needle
。
class Solution {
public:
int strStr(string haystack, string needle) {
int n = haystack.size(), m = needle.size();
for (int i = 0; i + m <= n; i++) {
bool flag = true;
for (int j = 0; j < m; j++) {
if (haystack[i + j] != needle[j]) {
flag = false;
break;
}
}
if (flag) {
return i;
}
}
return -1;
}
};
时间复杂度: O ( n × m ) O(n \times m) O(n×m)、空间复杂度: O ( 1 ) O(1) O(1)
本题是经典的字符串单模匹配的模型,因此可以使用字符串匹配算法解决,可以使用KMP算法解决,但是我不会,考研的时候了解过该算法,有时间仔细研究一下。