我指的是 Sedgewick 的“算法”一书中(第 4 版)中用于子串搜索的 Knuth-Morris-Pratt (KMP) 算法的大纲。
KMP 算法在基于确定性有限自动机 (DFA) 的子串搜索中使用备份。我了解 DFA 如何进入算法,但是我不了解如何构造DFA,这是通过以下代码片段完成的:
dfa[pat.charAt(0)][0] = 1;
for (int X = 0; j = 1; j< M; j++) {
for (int c = 0; c < R; c++) {
dfa[c][j] = dfa[c][X];
}
dfa[pat.charAt(j)][j] = j+1;
X = dfa[pat.charAt(j)][X];
}
其中M
是图案的长度pat
和R
字母的大小。该charAt()
函数返回相应位置的字符的整数值。
有人可以解释这段代码以什么方式构建 dfa 吗?我迷失在内部 for 循环的实际直观含义中。