這個演算法理解起來有點難受,建議看下簡單的串模式匹配演算法bf演算法刷下經驗,如上鏈結。
相比於brute-force(bf演算法),每當一趟匹配出現字元不等時,不需要回溯i指標(目標串指標),並且模式串指標j將從已經得到的部分匹配模式盡可能後移,從而降低時間消耗。
o(n+m)(bf演算法為o(n*m))
對於這個演算法說實話我看了兩個小時才懂得皮毛,寫這篇文章先收錄這個演算法,後面我會出更詳細的介紹(希望不是flag)
這個演算法包括兩個部分:
1)對模式串進行模式匹配並結果寫入next陣列
這個部分是為了完成在目標串和模式串不匹配時讓模式串指標盡可能後移,而後移的前提:
str(0~k-1)=str(j-k+1~j-1)
所以其實這部分也相當於在求出模式串每個字元前面的k個字元,與從str[0]開始的字元相同的個數,並將結果儲 存在next相應位置。
比如next[5]=2的意思時但匹配到5的時候字元不相等,這個時候因為指標5前面有乙個字元和開頭字元相等,則不 需要匹配第乙個字元,直接從第二個字元開始匹配。
2)目標串和模式串完成匹配並返回匹配結果
需要用到前面的next陣列,完成對模式串的「盡可能右移」。
#include#includeusing namespace std;
void pre_view_next(const string& str, int *next)//自身模式匹配
else
k = next[k]; }}
int load_kmp(const string& primer_str, const string& str, int *next)//主串primer_str同模式串str匹配
else
j = next[j];
} if (j == len2)
return i-len2;
else
return 0;
}int main()
演算法 串的模式匹配演算法(KMP)
串的模式匹配演算法 問題 求子串位置的定位函式如何寫?int index sstring s,sstring t,int pos 給定串s,子串t,問t在s中從pos位開始第一次出現的位置是?我沒有使用字元陣列或者string,而是自己實現sstring,這其實是資料結構作業 s 0 中存放的是串的...
KMP 模式串匹配演算法
這兩天讀了july的kmp,覺得很受益,寫下以作備忘。kmp最重要的就是求出next陣列,而next陣列則是通過不斷比較 str2 k 與 str2 j 來確定下乙個字元對應的 next數值 相等則直接next j k 不相等則令k next k 進行遞推直到出現 str2 k str2 j 相等的...
串 KMP模式匹配演算法
樸素模式匹配演算法就是簡單的二重迴圈,第一重迴圈主串s從1到n,然後第二重迴圈子串t從1到m進行匹配判斷,時間複雜度為o n m 1 m kmp演算法的核心思想是 第一 如果子串前r個字元均不相等,且子串前r個字元與主串某連續的r個字元匹配,但子串第r 1就不匹配了,則主串的匹配下標可以直接向前跳r...