• 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()函数最快,所以还需要研究下其源码

  • 相关阅读:
    Design:目录
    前端框架:template
    Template-ArtTemplate:artTemplate.js
    开发框架:AdminLTE
    开发框架:目录
    杂项:短网址
    httpd
    Java实现洛谷 P1428 小鱼比可爱
    Java实现洛谷 P1428 小鱼比可爱
    java实现洛谷P1308统计单词数
  • 原文地址:https://www.cnblogs.com/alike/p/13211310.html
Copyright © 2020-2023  润新知