【算法练习】终于理解kmp算法 /有限状态自动机

参考链接 :【宫水三叶】简单题学 KMP 算法

算法第四版 P499

动态规划之 KMP 算法详解

 

重点的我的理解是

匹配串pat串 例如 pat=“ABABC"

那么如果匹配到状态4的时候,匹配失败,匹配到的不是4 那么此时4的影子状态是2

why?

找影子状态的过程就是在pat中匹配pat[1:]的过程,此时pat[1:]="BAB"  那么只能匹配到AB 所以正好可以匹配到和后缀一样的前缀 

 

状态n也可以表示匹配到了n个字符;

根据匹配串来计算重启状态X  ;

28. 实现 strStr()

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;
}

};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值