kmp演算法的笨蛋理解
阿新 • • 發佈:2020-11-25
放在前面的話
如果第一次接觸 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; }