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不匹配,搜尋詞再往後移。就這樣,直到字串...