zoukankan      html  css  js  c++  java
  • 字符串匹配,KMP算法

    KMP的详解见:https://segmentfault.com/a/1190000008575379

    主要难点在于Next数组的理解,KMP是不需要回溯的匹配算法。

     1 #include<iostream>
     2 #include<string>
     3 #include<vector>
     4 #define MAXSIZE 100
     5 using namespace std;
     6 /*为方便理解算法,使用全局变量减少参数传递*/
     7 string T,P;
     8 vector<int> Next(MAXSIZE);
     9 
    10 void getNext();//获取带匹配字符串P的Next数组 
    11 int KMP();//返回匹配结果,若P为T的子串则返回匹配成功的T的下标,反之返回-1 
    12 
    13 int main()
    14 {
    15     cout<<"Text : ";
    16     getline(cin,T);//读取整行字符串,包括空格 
    17     cout<<"Part : ";
    18     getline(cin,P);
    19     int index=KMP();
    20     printf("index = %d
    ",index);
    21     return 0;
    22 }
    23 
    24 int KMP()
    25 {
    26     int i=0,j=0;
    27     int n=T.size(), m=P.size();//s.size()的返回值是unsigned类型,必须转为整型变量 
    28     getNext();
    29     while(i<n&&j<m){
    30         if(j==-1||T[i]==P[j]){
    31             i++;
    32             j++;
    33         }
    34         else{
    35             j=Next[j];
    36         }
    37 //        printf("i=%d, j=%d
    ",i,j); //用于查看匹配过程 
    38     }
    39     
    40     if(j==m) return i-j;
    41     else return -1;
    42 }
    43 
    44 void getNext()
    45 {
    46     int i=0,j=-1;
    47     Next[0]=-1;
    48     while(i<P.size()-1){
    49         if(j==-1||P[i]==P[j]){
    50             i++;
    51             j++;
    52         //    Next[i]=j; 
    53             if(P[i]!=P[j]||j==0)
    54                 Next[i]=j;
    55             else
    56                 Next[i]=Next[j];
    57         }
    58         else{
    59             j=Next[j];
    60         }
    61     }
    62 }
  • 相关阅读:
    小阳买水果
    单调队列+dp
    最长的合法序列(栈+dp)
    A. 打印收费
    数位dp(K好数)
    Floyd(选地址)
    最短路计数
    线段树维护区间01
    解密(拓展欧几里的)
    树、森林的遍历
  • 原文地址:https://www.cnblogs.com/yinhao-ing/p/10523233.html
Copyright © 2011-2022 走看看