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;
}