代码随想录:实现strStr()
代码随想录:实现strStr()
即kmp
这道题卡了我几天,因为难度太大经常没勇气写题。
kmp的原理我是明白的,问题是代码实现求next数组的时候,不同于手算可以轻松看出来最长公共前缀后缀,采用了用kmp算法来求next数组,也就是把前缀和后缀当成了两个字符串,求最长公共长度,如果匹配,则j+1,如果不匹配,则通过next数组上一位跳到上一个可能能匹配的地方。
代码跟着敲了一遍,还没完全懂,希望下次再见的时候能轻松拿下
class Solution {
public:
int strStr(string haystack, string needle) {
if (needle.size() == 0) {
return 0;
}
vector<int> next(needle.size());
getNext(next, needle);
int j = 0;
for (int i = 0; i < haystack.size(); i++) {
while (j > 0 && needle[j] != haystack[i]) {
j = next[j-1];
}
if (haystack[i] == needle[j]) {
j++;
}
if (j == needle.size()) {
return i - needle.size() + 1;
}
}
return -1;
}
void getNext(vector<int>& next, string s) {
int j = 0;
int i = 1;
next[0] = 0;
for (; i < s.size(); i++) {
while (j > 0 && s[i] != s[j]) {
j = next[j - 1]; // 循环到相等为止
}
if (s[i] == s[j]) {
j++;
}
next[i] = j;
}
}
};