C++ KMP算法
2017年10月29日 15:09:23 阅读数:555
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011197534/article/details/78385547
C++ KMP算法
差不多把《算法》这本书看完了,最后一章字符串比较常见的重要的东西应该是子串匹配的KMP方法。讲道理书上讲的比较复杂,也可能KMP本来理解就不容易,从网上找了几篇博文介绍的比较清晰,包括配图,可以参考。
http://www.cnblogs.com/c-cloud/p/3224788.html
(这篇参考了阮一峰的)
http://www.cnblogs.com/c-cloud/p/3224788.html
(这篇对理解next数组很有帮助)
自己手写了一下KMP,感觉代码不多,但确实句句有深意,写一写帮助理解吧。
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
void ComputePrefix(string s,int next[]){
int n = s.length();
int q,k;
next[0] = 0;
for(k=0,q=1;q<n;q++){
while(k>0 && s[k]!=s[q])
k = next[k];
if(s[k]==s[q])
k++;
next[q] = k;
}
}
void KMPMatcher(string text,string pattern) {
int n = text.length();
int m = pattern.length();
int next[pattern.length()];
ComputePrefix(pattern, next);
for(int i=0,q=0;i<n;i++) {
while(q>0 && pattern[q]!=text[i])
q = next[q];
if(pattern[q]==text[i])
q++;
if(q==m)
{
cout<<"Pattern occurs with shift "<<i-m+1<<endl;
q=0;
}
}
}
int main()
{
string s = "abcdabcdebcd";
string p ="bcd";
KMPMatcher(s, p);
cout<<endl;
return 0;
}