#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[]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。