原理参考ACM算法训练教程一书
////////////////////////////////////////////////// /*KMP算法*/ #include<stdio.h> #include<string.h> #include<iostream> using namespace std; void getNext(char a[],int next[]){ int i,j; next[1] = 0; j = 0; i = 2; int m = strlen(a)-1; //从a[1]开始 while(i<=m){ if(a[j+1] == a[i]){ j++; next[i++] = j; } else if(j==0){ next[i++] = 0; }else if(j>0){ j = next[j]; } } } int match(char a[],char b[],int next[]){ int i=0,j=0; int pos; int n = strlen(a)-1; int m = strlen(b)-1; while(1){ if(i>n) { pos = -1; break; } if(j==m){ //pos = i-j+1; break; cout<<i-j+1<<" "<<endl; j=next[j]; } if(b[j+1] == a[i+1] ){ j++; i++; }else{ if(j==0) i++; else if (j>0){ j = next[j]; } } } } /* int main() { //char b[] = "!ababbc"; char b[] = "!abab"; int l = strlen(b); int *next = new int[l-1]; getNext(b,next); int i; for(i=1;i<=l-1;i++){ printf("%d ",next[i]); } cout<<endl; char a[] = "!ababababbc"; int pos = match(a,b,next); cout<<endl<<pos<<endl; } */ ////////////////////////////////////////////////////// /* KMP应用: 求一个串中所有前缀等于后缀的子串长度 */ void output(int i,int next[]){ while(next[i]>0){ cout<<next[i]<<" "; i = next[i]; } } /* int main() { char b[] = "!ababa"; int l = strlen(b); int *next = new int[l-1]; getNext(b,next); int i; for(i=1;i<=l-1;i++){ printf("%d ",next[i]); } cout<<endl; output(l-1,next); delete[] next; } */
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-10 06:26:54