状态机示例:
算法步骤:
-
建立状态机 build(String pattern) 状态机只与pattern有关
dfa数组内涵和关系:
dfa[当前状态][将要遇到的字符]=dfa[下一个状态]
重启状态:当于第i个元素不匹配时,需要进行回溯;本来暴力算法要回溯到第1个元素,但现在将第1到第i-1元素的子串输入状态机,得到的状态为KMP的重启状态,从这个状态开始匹配减少无用的回溯。参考链接
-
初始状态base cases:
dfa[0][pattern.charAt(0)]=1
-
遍历pattern,匹配成功(j==pattern.charAt(i))状态转移:
dfa[i][pattern.charAt(i)]=i+1
-
遍历pattern,匹配失败状态重启(restart state):
dfa[i][j]=pre;
-
pre初始化为0, 遍历pattern,定义完当前i的下一个状态后,进行重启状态X的转移:
pre=dfa[pre][pattern.charAt(i)]
-
-
查找子串 search(String txt, String pattern)
-
从被匹配的文本(txt)头部开始查找,查到最后一个状态就“匹配成功”
-
否则,直到txt被匹配完还没有查找最后状态,就“匹配失败”
-
匹配成功后返回目前查找的位置i和pattern.length的差值+1(i-pattern.length+1),得到子串头部匹配位置
-