关于KMP算法的思考和总结

KMP算法是主串与匹配串,在主串中寻找匹配串在主串的开始位置。

两个下表i和k,i代表主串的字符位置,i是一层循环,不会回退,一直在主串中前进,匹配i个字符与匹配串的第k+1个字符的比较。

k代表匹配到的字符串的位置,也就是说是匹配到的相同字符在匹配串中的下标。采用k+1与i进行比较是因为k是已经匹配的串,要比较k+1个与主串中i的比较。

如果k+1和i不匹配了,会重新对k进行赋值k=next[k],那么为什么使用next[k]进行赋值呢?

因为如果已经匹配到了第k个位置,用k+1进行比较,那么如果出现不匹配情况了,k的位置是在已经匹配的在匹配串的最大相同长度

在这个最大相同长度里,用next算法算出来的,在最大长度的这个k的下标里,当前next【k】代表在当前位置,字符重复的位置,如果要重新匹配

不用回退到匹配串的0开始位置,直接回到后面重复的位置,因为既然匹配到了在匹配串中最大长度为k的位置,那么在主串中也一定相同,所以可以使用挪动到匹配串

后边相同的位置而不是开头的字符串0的位置。

-------------------------------------------------------------------------------------------

下面是关于next算法的一些思考和总结

next算法,在匹配串中计算与开头位置字符串匹配的重复位置与长度。

abcaba

循环下标从1开始,匹配用的相同字符下标k从-1开始,因为默认一开始没有相同的字符匹配,

用1和k+1进行比较,也就是用a与b进行比较,寻找相同位置,如果a与b不同,那么下次主串与匹配串进行匹配的时候就不会回退到b的位置,相反

如果1和k+1相同,说明开头是相隔相同的字母,比如aa,那么主串与匹配串进行匹配出错时,就可以回退到第二个a这里,而不用回退到第一个a

关于next和kmp主算法的连接,是使用k=next[k],当主串与匹配串的某个第i个和k+1个比较出错是,返回匹配串中重复串的后边那个的位置,

并且从后边那个重复串的k+1个字符,与主串中一直不断前进的第i个字符进行比较

--------------------------------------------------------------------------------------------

思考来源(12条消息) 可能是全网最清晰的KMP算法讲解_卡了个卡的博客-CSDN博客

感谢大佬的总结

posted @ 2022-09-30 10:46  myyssfb  阅读(52)  评论(0)    收藏  举报