KMP算法理解
KMP算法用于计算在一个字符串中找到指定字符串出现位置的算法。
通常我们的处理思维是,按顺序查找,匹配不上重新匹配。
如字符串BBC ABCDAB ABCDABCDABDE中,查找ABCDABD出现的位置。
为了描述方便字符串为S[i],待匹配字符串为P[j]
从S[0]和P[0]开始匹配
BBC ABCDAB ABCDABCDABDE
ABCDABD
不匹配,则i+1,S[1]和P[0]匹配
BBC ABCDAB ABCDABCDABDE
ABCDABD
依次类推
直到S[4]和P[0]匹配上,i、j指针分别加一,继续匹配
BBC ABCDAB ABCDABCDABDE
ABCDABD
当匹配到i=10,j=6时发现匹配失败,则需要回溯到S[5]和P[0]重新匹配
依次类推,直到找到i[15-21]、j[0-6]完全匹配上结束
BBC ABCDAB ABCDABCDABDE
ABCDABD
通过上面的描述,我们可以发现当字符串匹配到S[10]P[6]时,S中已经匹配的字符串里面是有A的并且还有AB
BBC ABCDAB ABCDABCDABDE
ABCDABD
我们完全可以从S中的第二个AB开始匹配,也就是S指针不变P指针前移4个单位
BBC ABCDAB ABCDABCDABDE
ABCDABD
i=10、j=2 S[10]和P[2]继续比较,发现不匹配后,再观察P[2]之前没有重复的字符,则可以从S[11]P[0]比较
BBC ABCDAB ABCDABCDABDE
ABCDABD
按顺序比较后到S[17]P[6]时发现不匹配,再将P指针前移4个单位
BBC ABCDAB ABCDABCDABDE
ABCDABD
i=17、j=2,匹配后继续指针加一匹配。直到完全匹配成功。得出字符串出现位置