設有兩個串s和t,在s串中找到乙個與t串相等的子串。
我們通常把s稱為目標串,t稱為模式串。
在講kmp演算法之前,先回憶一下簡單的暴力匹配演算法。其大概的思路為先從目標串的第乙個字元開始和模式串的第乙個字元相比較,若相等,則比較後續字元,否則從目標串的第二個字元開始重新比較。依此類推,如果匹配成功,輸出模式串的第乙個字元在目標串出現的位置。否則,匹配失敗。
下面是暴力匹配演算法的實現:
#include
using
namespace std;
intmain()
if(j >=
strlen
(t))
//j越界,表示匹配成功
cout << i-
strlen
(t)<< endl;
//輸出t在s中的位置
else cout <<
"no"
<< endl;
}return0;
}
然後我們發現這個演算法的平均時間複雜度大概是o(模式串長度*目標串長度),很容易理解,但是效率不高。所以就有人提出了kmp演算法。
理解了next陣列之後,發現kmp演算法容易很多,大概的過程是這樣的:
*
int i =
0, j =0;
while
(保證模式串和目標串都沒有掃瞄完)
有沒有發現這個和暴力匹配演算法很相似,kmp演算法僅僅是在兩個字串現所處的字元不相同時,直接回退模式串到next【j】值所在的位置,而不是移動目標串。但他的平均時間複雜度僅為o(模式串長度+目標串長度)。 對KMP演算法的理解
kmp演算法是一種高效的模式匹配演算法,複雜度可以達到o m n 而普通模式匹配演算法的複雜度為o m n 普通模式匹配演算法 從主串的第乙個字元 或者給定的第pos個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...
對KMP演算法的理解
kmp演算法是一種高效的模式匹配演算法,複雜度可以達到o m n 而普通模式匹配演算法的複雜度為o m n 普通模式匹配演算法 從主串的第乙個字元 或者給定的第pos個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...
對KMP演算法的理解
kmp演算法是一種高效的模式匹配演算法,複雜度可以達到o m n 而普通模式匹配演算法的複雜度為o m n 普通模式匹配演算法 從主串的第乙個字元 或者給定的第pos個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...