zoukankan      html  css  js  c++  java
  • KMP(模式匹配)

            字符串匹配中的一种KMP,该算法的关键是求出next[],当然理解是必须的,期待更深入的了解;

             hdu2087代码:

    #include<iostream>
    #include<string>
    using namespace std;
    const int Max=1001;
    string str,tar;
    int next[Max];//next串有很多变通的用法,例如hdu1358就是利用next来求重复前缀;

    ////////////////////////////////////////////////////////////////////////////////////////////
    void B_next(int n)
    {
     next[0]=-1;                                                   
     int i=0, j=-1;  //其实这时在某种程度可以把j看成一个模式串的小标(这里的模式串是tar,而母串却在变动)                                                              
     while(i<n)
     {
            if(j==-1||tar[i]==tar[j])//如果二者相等,说明next[i]比next[j]大一
      {

              i++;j++;
             next[i]=j;/////////////而不是next[i-1]+1;
      }
      else
       j=next[j];//不相等时,这时把可以把j看成模式匹配中模式串的下标;
     }
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////
    int main()
    {
     while(cin>>str)
     {
      int count=0;
      if(str[0]=='#')
       break;
      cin>>tar;
      int len1=str.length();
      int len2=tar.length();
      B_next(len2);//建立next[]数组
         int i=0,j=0;
    ///////////////////////////////////////////////////////////////////////////////////////////////////  

    while(i<len1)
      {
       if(j==-1||str[i]==tar[j])     
       {
        j++;i++;
       }
       else
       {
        j=next[j];//不相等时来移动模式串的下标
       }
       if(j>=len2){count++;j=0;}

    ///////////////////////////////////////////////////////////////////////////////////////////////////
      }
      cout<<count<<endl;

     }
    return 0;
    }

  • 相关阅读:
    实验二
    实验一简单的加减乘除
    自我简介
    软件工程——第五次博客作业
    《软件测试》--第四次博客作业
    软件测试 第三次作业
    软件测试 第二次作业
    个人简介
    软件测试 第一次测评
    AE CC 装不上,安装程序检测到计算机重新启动的过程可能暂停。建议退出安装程序,重新启动计算机,然后再重试。
  • 原文地址:https://www.cnblogs.com/orangeblog/p/2413938.html
Copyright © 2011-2022 走看看