KMP演算法模板 - 構建next最長字首陣列 與 kmp核心演算法
阿新 • • 發佈:2018-11-09
#include <iostream> #include <string> using namespace std; //構建next最長字首陣列 int* getNextArray(const string &sub) { if(sub.length() == 1) {//只有一個字元 return new int[1] {-1}; } int* next = new int[sub.size()]; next[0] = -1; next[1] = 0; int i = 2; int cn = 0;//用於儲存前一個字元的相同字首的長度 while (i < sub.size()){ if(sub[i - 1] == sub[cn]){//若又匹配的上,則再進行++,繼續往後一個字元進行判斷 ++cn; next[i] = cn; ++i; }else if(cn > 0){//若匹配不上,則將長度縮短為-原來匹配長度的位置-的 相同字首 的長度 cn = next[cn]; }else{//若cn = 0,即完全沒有相同字首的了 next[i] = 0; ++i; } } return next; } //kmp匹配演算法 int getIndexOf(const string &main, const string &sub) { if(main.empty() || sub.empty() || main.length() < sub.length()){ return -1; } int i1 = 0, i2 = 0; int* next = getNextArray(sub); while (i1 < main.length() && i2 < sub.length()) { if(main[i1] == sub[i2])//正常匹配 { ++i1; ++i2; }else if(next[i2] == -1)//子串第一個數就不匹配 { ++i1; }else//匹配不上 { i2 = next[i2]; } } return i2 == sub.size() ? i1 - i2 : -1;//完全匹配 or 匹配失敗 } int main() { const string main = "123456789abacdcabaegbfios", sub = "abacdcabae"; cout << getIndexOf(main, sub) << endl;// 9 return 0; }