1 2 3 3 2 3 4
找 2 3 4
找到 2 后发现不对,回退到 2, 再从 3 开始找
所以要避免回退。那就引入一个叫“状态”的词。
比如 1 2 3 里找 1 2 3
位置 1, 转移到 1, 2, 到 2, 3 ,状态 3, 匹配完成。
那假如是 1 2 1。状态 2 匹配完成后,3 失败,此时匹配 2 1
2 1, 最后转移到状态 1
那怎么记录任意的串最后的状态呢?
基于 DFA 的版本。
graph[外界值][目前状态] = 新状态
由于字符串匹配的性质,
if 外界值 == 目前状态,则 新状态 = 目前状态 + 1
问题在于 外界值 ≠ 目前状态该怎么做。
首先全初始化成 0 (缺省失败会回去)

假设我已经到了 5,匹配了 ABABA, 所以匹配的字符串长的样子是
XXXXXXABABAXXXXX
但是 A 已经匹配失败了,所以下面要从 BABA 开始,所以问题变成 BABA 后 DFA 在什么状态(也就是书里的 X)。那因为这是子问题,可以用 DFA 直接转移。
下面就不抄书了,就是记一个很 戸惑い 的点
参考
《算法 4》