参考链接 :【宫水三叶】简单题学 KMP 算法
算法第四版 P499
重点的我的理解是
匹配串pat串 例如 pat=“ABABC"
那么如果匹配到状态4的时候,匹配失败,匹配到的不是4 那么此时4的影子状态是2
why?
找影子状态的过程就是在pat中匹配pat[1:]的过程,此时pat[1:]="BAB" 那么只能匹配到AB 所以正好可以匹配到和后缀一样的前缀
状态n也可以表示匹配到了n个字符;
根据匹配串来计算重启状态X ;
如
class Solution {
public:
int strStr(string txt, string pat) {
//目标串 匹配串
//KMP算法 有限状态自动机法
if(pat==""){
return 0;
}
int N=txt.length();
int M=pat.length(); //匹配串
int dp[M][256]; //M个状态
memset(dp,0,sizeof(dp));
//有限状态机
dp[0][pat[0]]=1;
int X = 0;
for(int i=1;i<M;i++){
for(int j=0;j<256;j++){ //枚举256个字符
if(pat[i]==j){
dp[i][j] = i+1;
} else{
dp[i][j] = dp[X][j];
}
}
X = dp[X][pat[i]]; //更新X 影子状态
}
//search
int t=0;
for(int i=0;i<N;i++){
t = dp[t][txt[i]];
if(t==M){
return i-M+1;
}
}
return -1;
}
};