KMP算法之 好理解的模板
生活随笔
收集整理的這篇文章主要介紹了
KMP算法之 好理解的模板
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
主要作用:能夠在線性復雜度內求出一個串在另一個串的所有匹配位置。
說明:設模板串是 pattern, 令 next[i] = max{k|[pattern[0..k?1] = pattern[i?k+l..i] 得到。求解next[i]可以使用動態規劃,即 next[i+1] 可以由next[i],next[next[i]],…得到。
得到next[i]們數組之后,設兩個指針i和j,分別指向文本串和模式串,成功匹配得向后移動j,否則把/移動到 next[j]。 當j移動到模式串末尾時,就說明匹配成功。
首先是next[i]數組
vector<int> get_next(string ss) { //next[i] ,下標為i的 字符前 最長相等前后綴的長度int n = ss.size();vector<int>next(n + 1, 0);for (int i = 1; i < n; ++i){int j = i;while (j > 0){// 動態規劃j = next[j];if (ss[j] == ss[i]){// i+1 是因為當前的前后綴相等的是其后邊的結果next[i + 1] = j + 1;break;}}}return next; }KMP 匹配
vector<int>position;int m = text.size();for (int i = 0, j = 0; i < m; ++i){//cout << "j :" << j << endl;if (j < n && text[i] == pattern[j])++j;else{while (j > 0) //因為沒有如果沒有,next[j] 的值是0{// 回溯到最優位置,如果不為0,那么該位置前邊 next[j] -1的元// 素與i位置前邊next[j] -1元素是一樣的j = next[j];if (text[i] == pattern[j])//作用是如果回溯到的地方匹配上了,就從這個地方開始匹配{j++;//因為循環中有 i++break;}}}if (j == n)position.push_back(i - n + 1);}綜合:
vector<int> find_substring(string pattern, string text) {//next[i] ,下標為i的 字符前 最長相等前后綴的長度int n = pattern.size();vector<int>next(n + 1, 0);for (int i = 1; i < n; ++i){int j = i;while (j > 0){// 動態規劃j = next[j];if (pattern[j] == pattern[i]){// i+1 是因為當前的前后綴相等的是其后邊的結果next[i + 1] = j + 1; break;}}}vector<int>position;int m = text.size();for (int i = 0, j = 0; i < m; ++i){if (j < n && text[i] == pattern[j])++j;else{while (j > 0){// 回溯到最優位置,如果不為0,那么該位置前邊 next[j] -1的元素與i位置前邊next[j] -1元素是一樣的j = next[j];if (text[i] == pattern[j]){j++;break;}}}if (j == n)position.push_back(i - n + 1);}return next; }詳細解釋可以看這篇文章:
KMP算法詳解
總結
以上是生活随笔為你收集整理的KMP算法之 好理解的模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tire 模板(建议收藏)
- 下一篇: KMP 中next 数组的性质