zoukankan      html  css  js  c++  java
  • KMP

    KMP是一种改进的字符串匹配算法,我现在目前为止还只会裸的。

    kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置。常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(nm)。kmp算法通过一个O(m)的预处理,使匹配的复杂度降为O(n+m)。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<string>
     7 #include<vector>
     8 using namespace std;
     9 
    10 const int NN=1000007;
    11 
    12 int len1,len2,Next[NN];
    13 char s1[NN],s2[NN];
    14 vector<int>ans;
    15 
    16 void Make_Next()
    17 {
    18     Next[0]=-1,Next[1]=0;
    19     for (int i=2;i<=len2;i++)
    20     {
    21         int k=i-1;
    22         while(s2[i]!=s2[Next[k]+1])
    23         {
    24             k=Next[k];
    25             if (k==0) break;
    26         }
    27         Next[i]=Next[k]+1; 
    28     }
    29     Next[0]=0;
    30 }
    31 void Kmp()
    32 {    
    33     Make_Next();
    34     int i=1,j=1;
    35     while (i<=len1)
    36         if (s1[i]==s2[j])
    37         {
    38             i++,j++;
    39             if (j==len2+1)
    40             {
    41                 j=Next[j-1]+1;
    42                 ans.push_back(i-len2);
    43             }
    44         }
    45         else
    46         {
    47             if (j==1) i++;
    48             j=Next[j-1]+1;
    49         }
    50 }
    51 int main()
    52 {
    53     scanf("%s%s",s1+1,s2+1);
    54     len1=strlen(s1+1),len2=strlen(s2+1);
    55     
    56     Kmp();
    57     
    58     for (int i=0;i<ans.size();i++)
    59         printf("%d
    ",ans[i]);
    60 }
  • 相关阅读:
    课程总结
    每日总结66
    每日总结65
    每日总结64
    每日总结63
    每日总结62
    每日总结61
    每日总结60
    偶滴点NET复习
    内部异常SocketException由于目标计算机积极拒绝
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/7172286.html
Copyright © 2011-2022 走看看