zoukankan      html  css  js  c++  java
  • KMP算法

    KMP算法:

    指一种字符串匹配的算法。

    引子:

    事实上就是依据字符串本身的性质推断若当前位置不匹配。则最少右移几位能够開始匹配。
    比方字符串为babba,若最后一位不匹配则显然右移一位,两位均不可,但右移三位能够。由于前两个字符。和后两个字符相等。这样就大大降低了移动速度。匹配次数。

    算法详细实现过程:

    实现事实上是一种图论的方法实现。之前的样例最后一位不成功,就要再从第三位開始比較,我们将这种一种关系,叫做失配边。
    所以显然我们的任务有两个:

    1.建立失配边

    失配边的建立,靠递归,由于失配边事实上就是自己去匹配自己。
    最好还是设a为被匹配字串,长度为n
    b为匹配字串。长度为m
    f数组即failure function是记录失配边的。即当前位置失败了,要从f[i]開始匹配当前位置。
    注意不论字符串还是字符型数组都是从0開始的。

      f[0]=0;f[1]=0;
      for(int i=1;i<m;i++){
        int j=f[i];
        while(j&&b[j]!=b[i])j=f[j];
        f[i+1]= b[i]==b[j] ? j+1:0;
      }
    f[i]表示0~f[i]-1与i-f[i]-1~i-1相等

    2.匹配

    有了f[],匹配就非常好完毕了。

      int j=0;
      for(int i=0;i<n;i++){
        while(j&&b[j]!=a[i])j=f[j];
        if(b[j]==a[i])j++;
        if(j==m)printf("%d
    ",i-m+1);
      }

    //假设不等就回溯
    //假设相等就+1

    简单例题

    POJ3461 Oulipo
    POJ2406 Power Strings
    POJ1961 Period

    简单性质:

    推断循环节:
    len%(len-f[len])==0

  • 相关阅读:
    EasyUI datagrid 的多条件查询
    js将时间戳转换为日期类型
    js限制字符串长度,超出的部分补...
    js打印WEB页面内容代码大全
    js倒计时一分钟
    java获取上个星期第一天和最后一天
    两个Html页面之间值得传递
    jS处理中英文时间格式化问题
    JS获取当月第一天和最后一天
    Java 计算两个日期相差月数、天数
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7357954.html
Copyright © 2011-2022 走看看