#include<string> #include<iostream> using namespace std; int KMP(string& pat,string& str,int k,int *next){//返回pat第一次匹配到str的数组位置 int posP=0; int posT=k; int lengthP=pat.length(); int lengthT=str.length(); while(posP<lengthP && posT<lengthT){ if(posP==-1 || pat[posP]==str[posT]){ posP++; posT++; } else posP=next[posP]; } if(posP<lengthP) return -1; else return posT-lengthP; } void getNext(string& str,int next[]){ int j=0,k=-1,lengthP=str.length(); next[0]=-1; while(j<lengthP){ if(k==-1 || str[j]==str[k]){ j++; k++; next[j]=k; }else k=next[k]; } } void main(){ string str,pat; cout<<"输入目标串:"; cin>>str; cout<<"输入模式串:"; cin>>pat; int size=pat.length(); int *next,k=0; next=new int[size]; getNext(pat,next); for(int i=0;i<size;i++){ cout<<next[i]; } cout<<endl; cout<<KMP(pat,str,k,next); }
运行截图:
用一个辅助数组next[]
原文链接:https://www.f2er.com/datastructure/383119.html