日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

KMP算法之 好理解的模板

發布時間:2025/3/19 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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算法詳解

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的KMP算法之 好理解的模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。