个人感觉这种比较好理解
讲解的很好的一篇文章KMP算法详解
例题leetcode
class Solution {
public:
int strStr(string haystack, string needle) {
if(!needle.size()) return 0;
int szn = needle.size(),szh = haystack.size();
vector<int> nex;
nex.push_back(0);
int pos = 0;
for(int i = 1;i<szn;)
{
if(needle[i] == needle[pos])pos++,i++,nex.push_back(pos);
else if(pos) pos = nex[pos - 1];
else nex.push_back(0),i++;
}
pos = 0;
for(int i = 0;i<szh;)
{
if(haystack[i] == needle[pos])i++,pos++;
else if(pos)pos = nex[pos - 1];
else i++;
if(pos == szn)return i - pos;
}
return -1;
}
};
加上0这个位置上的哨兵
class Solution {
public:
int strStr(string s, string p) {
int n = s.size(), m = p.size();
if(m == 0) return 0;
//设置哨兵
s.insert(s.begin(),' ');
p.insert(p.begin(),' ');
vector<int> next(m + 1);
//预处理next数组
for(int i = 2, j = 0; i <= m; i++){
while(j and p[i] != p[j + 1]) j = next[j];
if(p[i] == p[j + 1]) j++;
next[i] = j;
}
//匹配过程
for(int i = 1, j = 0; i <= n; i++){
while(j and s[i] != p[j + 1]) j = next[j];
if(s[i] == p[j + 1]) j++;
if(j == m) return i - m;
}
return -1;
}
};