首先我们要知道KMP其实不难
首先理解next数组的作用
int ss=S.size();//模板长度
int ts=T.size();//文本串长度
int prev = -1;
int curr = 0;
int res = 0;
int next[ss+1];
next[0]=-1;//一定要初始化-1
for(;curr<ss;){//
if(prev == -1|| S[prev] == S[curr]){
//如果prev==-1说明已经到达数组底部
//到达此处只有两种情况
//1、刚刚开始计算数组next
//2、由于后面无法对其导致一直前推导0位置next为-1 此时会将curr++
curr++;
prev++;
next[curr]=prev;
}else{
prev = next[prev];//如果对不上则前推
}
}
其次就是它计算部分 其实也很简答
class Solution {
public:
int kmp(string S, string T) {
int ss=S.size();
int ts=T.size();
int prev = -1;
int curr = 0;
int res = 0;
int next[ss+1];
next[0]=-1;
for(;curr<ss;){
if(prev == -1|| S[prev] == S[curr]){
curr++;
prev++;
next[curr]=prev;
}else{
prev = next[prev];
}
}
//计算部分
curr=0;
int partment=0;
for(;curr<ts;){
if(partment==-1|| S[partment]==T[curr]){
curr++;
partment++;
if(partment==ss){
res++;
partment = next[partment];
}
}else{
partment=next[partment];
}
}
return res;
}
};