C++ KMP算法

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章