1. 程式人生 > 實用技巧 >kmp演算法的笨蛋理解

kmp演算法的笨蛋理解

放在前面的話

如果第一次接觸 kmp,不要看我寫的理解。程式碼可看。

如果第一次接觸 kmp,不要看我寫的理解。程式碼可看。

如果第一次接觸 kmp,不要看我寫的理解。程式碼可看。

笨蛋理解

kmp 演算法用於查詢指定字串在目標字串中的位置。

我們把指定字串叫短的,目標字串叫長的。

------------------------------------------------

------

當 長的 和 短的 第一個位置的字元就不相等時我們就把 短的 向右滑動一格。

但是如果 長的 和 短的 已經對比了很多個字元時。

我們應該利用之前的比較資訊,將 短的 向右滑動到指定位置處,繼續和 長的 的待比較字元 比較。

滑動的效果是,短的 最大字首 正好和 長的 對應上。

如果有比較失敗了,則重複 ●, 直到比較位置回到 段的 的第一格。

簡單例項

#include <iostream>
#include <string>
#include <vector>
#include <cstring>

using namespace std;

void mfunc(const char * mstr, vector<int> &next)
{
        int i = 0, j = -1;
        int size = strlen(mstr);

        next[
0] = -1; while(i < size - 1){ if(j == -1 || mstr[i] == mstr[j]) next[++i] = ++j; else j = next[j]; } } int kmp(const char * dest, const char *mstr) { int len = strlen(dest); int size = strlen(mstr); vector
<int> next(size); int i = 0, j = 0; mfunc(mstr, next); while(j < size && i < len){ if(j == -1 || dest[i] == mstr[j]){ i++; j++; } else j = next[j]; } if(j < size) return -1; return i-j; } int main() { const char * dest = "abababccbababad"; const char * mstr = "bababad"; int ans = kmp(dest, mstr); cout << ans << endl; }