题意:
给你一个文本串 T ,一个非空模板串 S ,问 S 在 T 中出现了多少次?
方法:
kmp
思路:kmp算法本质要求模式串的 next[ ]数组,next[ i ]表示模式串0 ~ i 的最长公共前后缀的长度。
kmp算法对文本串不会回溯,只是通过next[ ]回溯模式串。
核心思想:next[ ] 数组存储的最长公共前后缀长度,与在模式串中即将转跳的 下标 密切相关。
首先,先根据模式串求得next[ ]数组;
然后,利用next[ ] 遍历文本串,求得模式串在文本串中出现了几次。
KMP匹配过程:
class Solution {
public:
int n1,n2;
int next[500005];//存储最长公共前后缀的长度
int kmp(string S, string T) {
n1=S.size();
n2=T.size();
get_next(S);//获取模式串的next[]
int res=0;
int j=0;
for(int i=0;i<n2;i++){//遍历文本串
while(j>0&&T[i]!=S[j])
j=next[j-1];
if(T[i]==S[j])
j++;
if(j==n1){//如果模式串匹配结束,则出现次数+1
res++;
j=next[j-1];
}
}
return res;
}
void get_next(string S){//获取模式串的next[]
int j=0;
next[0]=0;//初始化
for(int i=1;i<n1;i++){//循环模式串
while(j>0&&S[i]!=S[j]){
j=next[j-1];
}
if(S[i]==S[j]){
j++;
next[i]=j;
}
}
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号