zoukankan      html  css  js  c++  java
  • 关于KMP算法的理解

    上次因为haipz组织的比赛中有道题必须用到KMP算法,因此赛后便了解了下它,在仔细拜读了孤~影神牛的文章之后有种茅塞顿开的感觉,再次ORZ。

    附上链接http://www.cnblogs.com/yjiyjige/p/3263858.html

    对于整个KMP算法,最精髓的部分便是关于next数组的生成。一开始ruijia liu的书上贴上的代码感觉完全不能理解,但是看神犇的分析觉得似乎明白了什么故写下此文来理理思路。

    在整理思路之前首先记住一句话:next[j]表示的是当在str2[j]!=str1[i]时,j指针应该移向的位置。

    对于next[j]的还有一种理解:对于0到当前j这样一段字符串,是前缀与后缀相同长度的最大值

    如对于abcab,next[5]=2,则表示当str2[5]!=str1[i]时(虽然这样的情况不可能存在,因为此时已经发现最大长度),应该直接从str[2]开始比较,因为对于当前子字符串,前缀"ab"等于后缀"ab",因此直接从j=2开始比较即可。(这种貌似要形象一点,注意是“当前字符串”)。

    然后怒贴代码逐句分析(不能理解处点入链接)

    void getnext()
    {
        next[0]=next[1]=0;// 当j=0时匹配即不成功的话自然还是应当从0开始匹配

                   //而1是自然应该从0开始比较无疑
        for(int i=1;i<len2;i++)//牢记目标,是为了求出当i+1不能匹配时j指针应该回到的位置
        {
            int j=next[i];//j是临时的一个变量,暂时存放之前得到的比较结果,减少比较量
            while(j&&str2[j]!=str2[i]) j=next[j];//这里便是分歧之一:当j=0时自然不用说,当j不等于零时,便更深一步与靠前的前缀进行比较,这样一是可以节省运算量,

                                                     //二是可以确定所得的next[j]是最大的,若不是最大的必然会在比较中漏比较
            next[i+1]=str2[j]==str2[i]?j+1:0;//当前str[j]==str[i]的话就是当前next[j]+1;如果不想等就是0,即前缀后缀无相等的部分
        }
    }

    在有两道题HDOJ 1711 HDOJ 1358都是基本应用,AC吧!

  • 相关阅读:
    Winfrom判断用户输入是否为int整型方法之一!
    C#winfrom 中的MessageBox 弹出提示框
    C# WinForm窗口关闭的几种常用方法
    excel数据生成sql语句
    Redis 发布和订阅
    C# Redis消息队列例子2
    C# Redis消息队列例子
    win10屏幕亮度无法调节,已解决
    VUE 日期组件(包括年选择)
    暴力递归-逆序栈
  • 原文地址:https://www.cnblogs.com/acalvin/p/3556719.html
Copyright © 2011-2022 走看看