zoukankan      html  css  js  c++  java
  • 字符串匹配——KMP

    KMP
    暴力算法:
    S:较长的串,p较小的串,需要在S中查询的串

    for(int i=1;i<=n;i++){//从s[i]开始匹配p 
      bool flag=true;
      for(int j=1;j<=m;j++)
        if(s[i+j-1]!=p[j]){
          flag=false;
          break;
         } 
      }

    next[i]:表示以i为终点的后缀和从1开始的前缀相等,并且后缀的长度最长
    next[i]=j:表示p[1,j]=p[i-j+1,i]

    KMP匹配过程

    for(int i=1,j=0;i<=m;i++){//字符串s,p都是从1开始 
      while(j&&s[i]!=p[j+1]) j=ne[j];//当下一个位置不相等时,j就往前退,也就是p整体右移;j=0表示退无可退 
      if(s[i]==p[j+1]) j++; 
      if(j==n){
        //匹配成功 
      }
    }

    求next

    ne[1]=0;
    for(int i=2,j=0;i<=n;i++){
      while(j&&p[i]!=p[j+1]) j=ne[j];
      if(p[i]==p[j+1]) j++;
      ne[i]=j;
    }

    注:这里的代码都是从1开始,也就是cin>>p+1>>s+1;

    写于:2020/9/12 15:58


    作者:孙建钊
    出处:http://www.cnblogs.com/sunjianzhao/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Vue自定义指令 directive
    Vue过滤器 filters
    贪心
    家庭作业
    线段
    数列极差
    shell
    智力大冲浪
    加工生产调度
    喷水装置
  • 原文地址:https://www.cnblogs.com/sunjianzhao/p/13657353.html
Copyright © 2011-2022 走看看