简单说一下,KMP是一个时间复杂度O(n+m)的字符串匹配算法,网上也有很多其他的解法,比如next数组的解法,推荐看这里
匹配的思路
DFA:确定有限自动状态机
以下是ABABAC的对应的DFA:
1.假设文本为txt,待匹配的子串为pat。
2.未匹配是状态0,此时如果条件A(匹配到了txt的字符‘A‘),会到状态1,如果是条件B、C或其他的条件,还是状态0。如果经历了匹配ABABA之后到达状态5,再匹配C到达状态6,即停止状态,也就是匹配成功。
3.很明显,dfa[][]是一个二维数组,dfa['A'][3]就是在状态3时,下一个条件是A时,要跳转到哪一个状态。
4.匹配的过程就是:不断的用txt的字符 + 当时的状态去dfa取值,直到状态6 or txt匹配到最后一个字符,结束。
5.匹配过程中,txt的字符是一个一个往后取,不会回溯,只是状态一直在变化,即本次使用的是上一次匹配后的状态,不会回溯,正是KMP算法相对于暴力解法的优势。
DFA数组的构建
上边的思路如果理解了,那么剩下的问题就是如何构建dfa[][],当然这也是难点。dfa[][]的元素分为两类:1,匹配成功;2,匹配失败。
1.匹配成功
初始可确定

本文介绍了KMP算法的DFA(确定有限自动状态机)解法,详细阐述了匹配思路和DFA数组的构建过程。通过构建DFA数组来处理匹配成功和失败的情况,并提供了状态指示数组X的使用方法,帮助理解KMP算法如何利用DFA进行字符串匹配。
KMP算法的DFA解法&spm=1001.2101.3001.5002&articleId=63807324&d=1&t=3&u=c8775cd9a32f42539202226567f90f22)
539

被折叠的 条评论
为什么被折叠?



