KMP是以三个人的名字缩写命名的。
next数组中存储的是位置,该位置是当文本串和模式串不匹配时,模式串应该重新回到的位置,以再次进行匹配。
next数组是通过计算最长相等前后缀得到。
此处使用前缀表统一减一实现。
class Solution {
public:
void getNext(const string& needle, vector<int>& next){
// 根据模式串获取next数组
int j=-1;
next[0] = j;
for(int i=1; i<needle.size(); ++i){
while(j>=0 && needle[i] != needle[j+1]){
j = next[j];
}
if(needle[i] == needle[j+1]){
j++;
}
next[i] = j;
}
}
int strStr(string haystack, string needle) {
int j=-1;
vector<int> next(needle.size());
getNext(needle, next);
for(int i=0; i<haystack.size(); ++i){
while(j>=0 && haystack[i] != needle[j+1]){
j = next[j];
}// 后退
if(haystack[i] == needle[j+1]){
j++;
}
if(j == (needle.size()-1)){
//cout << i << j<<endl;
return i-needle.size()+1;
}
}
return -1;
}
};