KMP算法——leetcode第28题

题目--28、实现strStr

这道题以前做题的时候卡住了,导致后面也没兴趣做下去其他的题目,看题解也没看懂,KMP算法。今天重新看了一遍高赞题解,有了新认识,遂记录下来,后面可以复习。

  • 题目分析:实现一个indexof()函数功能
  • 输入为两个,一个为待匹配的字符串target,一个为匹配模板pattern。
  • 对不同target,寻找pattern在其中的位置。
  • 这用到的主要知识是状态转移机,也是KMP算法的核心
  • 要实现状态转移功能,代码主要通过以下来实现
int len=pattern.length();
int[][] dp=new int[len][256];
dp[0][pattern.charAt(0)]=1;
int x=0;//影子状态,用来构建dp数组
for(int i=1;i<len;i++){
   for(int j=0;j<256;j++)//先根据影子状态将全部进行设初值
        dp[i][j]=dp[x][j];
   dp[i][pattern.charAt(i)]=i+1;//覆盖特殊的一个值
   x=dp[x][pattern.charAt(i)];//更新影子状态
}
  • 其中影子状态是精髓,因为这是确定性状态转移机,所以从前面状态到后面状态只有一种情况,其他255种情况都需要用影子状态来判断。
  • 生成状态转移机后就很简单可以用了:
int state=0;
for(int i=0;i<target.length();i++){
    state=dp[state][target.charAt(i)];
    if(state==len)
       return i-len+1;
}
return -1;

总结

能够将课本学到的知识实现在工程代码上有一种成就感,不过测试时间有点久,直接用java的indexof()函数最快,所以还需要研究下其源码

posted @ 2020-06-30 00:29  浮尘2333  阅读(94)  评论(0编辑  收藏  举报