C 字串KMP演算法

2021-10-03 13:54:19 字數 1326 閱讀 6914

i:主串j:模式串的 下標(常取1~m);next陣列:可部分重疊,但不可是本身。

next[j]:所求最長前字尾中字首最後一位的下標,從next[j]處的字元開始重新與主串比較

好處:不需要回溯,減少了i/o操作

字串均是從1開始(1<=~<=str.len)

字串都從1開始,0表示為沒有匹配的元素,要移動主串。

所以i=1,j=0; 當substr[i]==substr[j]時,同時後移並且標記,該位置上的i如果不匹配就找j(next[i]=j)

void getnext(string substr, int nextval)

else

j = nextval[j];

}}

kmp陣列:i為主串位置,j為模式串位置,都從1開始匹配。當j=0時表示第乙個位置就不和主串匹配需要移動主串。直到移動到》=length!(從1開始)

int kmp(string str, string substr, int next)

else j = next[j];

} if (j > substr.size())

return i - substr.size();

return 0;

}

main()初始化時:可以使用char【】陣列的方式;

也可使用string的方式但由於需要從1開始,要在前面插入乙個不存在的字元。

如果substr[next[i]]==substr[i]

nextval[i]也等於它的nextval[next[i]]否則就等於next[i]

字串 KMP演算法

而kmp演算法在字串匹配方法中乙個很著名並且很聰明的演算法,當然也確實比較難理解。甚至於有程式設計師因為無法理解kmp演算法而直接改用暴力匹配。本身自己學演算法起步較晚,第一次接觸到kmp演算法已經是研究生畢業一年了。雖然帶著研究生的學歷背景,但是剛開始看的時候依然是一臉懵逼。看了很多博主的講解總算...

字串 KMP演算法

而kmp演算法在字串匹配方法中乙個很著名並且很聰明的演算法,當然也確實比較難理解。甚至於有程式設計師因為無法理解kmp演算法而直接改用暴力匹配。本身自己學演算法起步較晚,第一次接觸到kmp演算法已經是研究生畢業一年了。雖然帶著研究生的學歷背景,但是剛開始看的時候依然是一臉懵逼。看了很多博主的講解總算...

字串演算法 KMP演算法

給定字串m和n m比n長 找出n在m中出現的匹配位置。說白了,就是乙個簡單的字串匹配。例如 首先,字串 bbc abcdab abcdabcdabde 的第乙個字元與搜尋詞 abcdabd 的第乙個字元進行比較。因為b與a不匹配,所以搜尋詞後移一位。因為b與a不匹配,搜尋詞再往後移。就這樣,直到字串...