KMP算法

来源:互联网 发布:伊苏里亚王朝 知乎 编辑:程序博客网 时间:2024/05/21 15:46

问题描述:有一个文本串S,和一个模式串P,查找P在S中的位置


暴力破解法:

  1. int ViolentMatch(char* s, char* p)  
  2. {  
  3.     int sLen = strlen(s);  
  4.     int pLen = strlen(p);  
  5.   
  6.     int i = 0;  
  7.     int j = 0;  
  8.     while (i < sLen && j < pLen)  
  9.     {  
  10.         if (s[i] == p[j])  
  11.         {  
  12.             //①如果当前字符匹配成功(即S[i] == P[j]),则i++,j++      
  13.             i++;  
  14.             j++;  
  15.         }  
  16.         else  
  17.         {  
  18.             //②如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0      
  19.             i = i - j + 1;  
  20.             j = 0;  
  21.         }  
  22.     }  
  23.     //匹配成功,返回模式串p在文本串s中的位置,否则返回-1  
  24.     if (j == pLen)  
  25.         return i - j;  
  26.     else  
  27.         return -1;  
  28. }  

看的头大   http://blog.csdn.net/v_july_v/article/details/7041827   ~~~~





#include <iostream>#include <string>using namespace std;void getnext(string p,int next[]){int plen=p.length();next[0]=-1;int k=-1;//前缀int j=0;//后缀while(j<plen-1){if (k==-1 || p[j]==p[k]){j++;k++;if(p[j]!=p[k])next[j]=k;else//不出现循环next[j]=next[k];}else{k=next[k];}}}void kmp(string s,string p,int next[]){int slen=s.length();int plen=p.length();int i=0;int j=0;while(i<slen-1 && j<plen-1){if(j==-1 || s[i]==p[j])//j==-1 !!!!!{i++;j++;}elsej=next[j];}if(j==plen-1){cout<<"true"<<endl;}elsecout<<"false"<<endl;}int main(){string s;string p;cin>>s;cin>>p;int *next=new int[p.length()];getnext(p,next);kmp(s,p,next);delete [] next;return 0;}





0 0