![Page 1: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/1.jpg)
Algorithms, 4th Edition · Robert Sedgewick and Kevin Wayne · Copyright © 2002–2010 · December 1, 2010 10:58:30 PM
Knuth-Morris-Pratt
![Page 2: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/2.jpg)
Include one state for each character in pattern (plus accept state).
Knuth-Morris-Pratt construction
2
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6
0 1 2 3 4 5 A B A B A C
dfa[][j]ABC
pat.charAt(j)j
X
![Page 3: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/3.jpg)
Match transition: advance to next state if c == pat.charAt(j).
Knuth-Morris-Pratt construction
3
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A AB C
0 1 2 3 4 5 A B A B A C 1 3 5 2 4 6
dfa[][j]ABC
pat.charAt(j)j
X
![Page 4: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/4.jpg)
Mismatch transition: back up if c != pat.charAt(j).
Knuth-Morris-Pratt construction
4Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
B C
0 1 2 3 4 5 A B A B A C 1 3 5 0 2 4 0 6
dfa[][j]ABC
j
pat.charAt(j)j
X
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
![Page 5: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/5.jpg)
Mismatch transition: back up if c != pat.charAt(j).
Knuth-Morris-Pratt construction
5Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A AC
B,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 5 0 2 4 0 0 6
dfa[][j]ABC
X
X
j
pat.charAt(j)j
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
![Page 6: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/6.jpg)
Mismatch transition: back up if c != pat.charAt(j).
Knuth-Morris-Pratt construction
6Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,CC
B,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 5 0 2 0 4 0 0 0 6
dfa[][j]ABC
X
X
j
pat.charAt(j)j
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
![Page 7: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/7.jpg)
Mismatch transition: back up if c != pat.charAt(j).
Knuth-Morris-Pratt construction
7Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
A
CB,CC
B,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 0 2 0 4 0 0 0 0 6
dfa[][j]ABC
X
X
j
pat.charAt(j)j
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
![Page 8: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/8.jpg)
Mismatch transition: back up if c != pat.charAt(j).
Knuth-Morris-Pratt construction
8Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0 6
dfa[][j]ABC
X
X j
pat.charAt(j)j
![Page 9: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/9.jpg)
Mismatch transition: back up if c != pat.charAt(j).
Knuth-Morris-Pratt construction
9Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]ABC
X
pat.charAt(j)j
B
jX
![Page 10: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/10.jpg)
Knuth-Morris-Pratt construction
10Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]ABC
X
pat.charAt(j)j
B
![Page 11: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/11.jpg)
Algorithms, 4th Edition · Robert Sedgewick and Kevin Wayne · Copyright © 2002–2010 · December 1, 2010 10:58:30 PM
Knuth-Morris-Pratt
![Page 12: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/12.jpg)
Include one state for each character in pattern (plus accept state).
Knuth-Morris-Pratt construction
12
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6
0 1 2 3 4 5 A B A B A C
dfa[][j]ABC
pat.charAt(j)j
X
![Page 13: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/13.jpg)
Match transition. For each state j, dfa[pat.charAt(j)][j] = j+1.
Knuth-Morris-Pratt construction
13
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A AB C
0 1 2 3 4 5 A B A B A C 1 3 5 2 4 6
dfa[][j]ABC
pat.charAt(j)j
X
first j characters of patternhave already been matched
now first j+1 characters ofpattern have been matched
![Page 14: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/14.jpg)
Mismatch transition.
Knuth-Morris-Pratt construction
14Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
B C
0 1 2 3 4 5 A B A B A C 1 3 5 0 2 4 0 6
dfa[][j]ABC
j
pat.charAt(j)j
X
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
![Page 15: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/15.jpg)
Knuth-Morris-Pratt construction
15Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A AC
B,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 5 0 2 4 0 0 6
dfa[][j]ABC
X
X
j
pat.charAt(j)j
Mismatch transition. For each state j and char c != pat.charAt(j),dfa[c][j] = dfa[c][X]; then update X = dfa[pat.charAt(j)][X].
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
![Page 16: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/16.jpg)
Knuth-Morris-Pratt construction
16Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,CC
B,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 5 0 2 0 4 0 0 0 6
dfa[][j]ABC
X
X
j
pat.charAt(j)j
Mismatch transition. For each state j and char c != pat.charAt(j),dfa[c][j] = dfa[c][X]; then update X = dfa[pat.charAt(j)][X].
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
![Page 17: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/17.jpg)
Knuth-Morris-Pratt construction
17Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
A
CB,CC
B,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 0 2 0 4 0 0 0 0 6
dfa[][j]ABC
X
X
j
pat.charAt(j)j
Mismatch transition. For each state j and char c != pat.charAt(j),dfa[c][j] = dfa[c][X]; then update X = dfa[pat.charAt(j)][X].
Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]
pat[j]j
ABC
X
X j
X
X
X
X
j
j
j
j
j
0 1 2 3 4 5A B A A
B,C
A
CB,CC
B,C A
B
0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3 4A B A
A
CB,CC
B,C A
B
0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2 3A B A
B,CC
B,C A
0 1 2 A B A 1 1 3 0 2 0 0 0 0
dfa[][j]
pat[j]j
ABC
X
0 1 2A BC
B,C A 0 1 A B 1 1 0 2 0 0
dfa[][j]
pat[j]j
ABC
X
0 1A
B,C 0 A 1 0 0
dfa[][j]
pat[j]j
ABC
copy dfa[][X] to dfa[][j]
dfa[pat[j]][j] = j+1;
X = dfa[pat[j]][X]];
![Page 18: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/18.jpg)
Knuth-Morris-Pratt construction
18Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B,C A
B C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0 6
dfa[][j]ABC
X
X j
pat.charAt(j)j
Mismatch transition. For each state j and char c != pat.charAt(j),dfa[c][j] = dfa[c][X]; then update X = dfa[pat.charAt(j)][X].
![Page 19: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/19.jpg)
Mismatch transition. For each state j and char c != pat.charAt(j),dfa[c][j] = dfa[c][X]; then update X = dfa[pat.charAt(j)][X].
Knuth-Morris-Pratt construction
19Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]ABC
X
pat.charAt(j)j
B
jX
![Page 20: Knuth-Morris-Pratt · Include one state for each character in pattern (plus accept state). Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A](https://reader034.vdocuments.us/reader034/viewer/2022042111/5e8c23891f9b0042c30df071/html5/thumbnails/20.jpg)
Knuth-Morris-Pratt construction
20Constructing the DFA for KMP substring search for A B A B A C
0 1 2 3 4 5 6A B A A
B,C
A
CB,CC
B
AB,C A
C
0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6
dfa[][j]ABC
X
pat.charAt(j)j
B