Skip to content

Commit 1be234e

Browse files
committedFeb 7, 2020
add kmp
1 parent bdb3dc5 commit 1be234e

File tree

3 files changed

+74
-1
lines changed

3 files changed

+74
-1
lines changed
 

‎README.md

+2
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ Try to keep the interface and variable name consistent with the original book wh
8484
* [Quick3string](algs4/quick3_string.py)
8585
* [TrieST](algs4/trie_st.py)
8686
* [TST](algs4/tst.py)
87+
* [KMP](algs4/kmp.py)
88+
8789
## License
8890

8991
This code is released under MIT.

‎algs4/kmp.py

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
"""
2+
* Execution: python kmp.py pattern text
3+
*
4+
* Reads in two strings, the pattern and the input text, and
5+
* searches for the pattern in the input text using the
6+
* KMP algorithm.
7+
*
8+
* % python kmp.py abracadabra abacadabrabracabracadabrabrabracad
9+
* text: abacadabrabracabracadabrabrabracad
10+
* pattern: abracadabra
11+
*
12+
* % python kmp.py rab abacadabrabracabracadabrabrabracad
13+
* text: abacadabrabracabracadabrabrabracad
14+
* pattern: rab
15+
*
16+
* % python kmp.py bcara abacadabrabracabracadabrabrabracad
17+
* text: abacadabrabracabracadabrabrabracad
18+
* pattern: bcara
19+
*
20+
* % python kmp.py rabrabracad abacadabrabracabracadabrabrabracad
21+
* text: abacadabrabracabracadabrabrabracad
22+
* pattern: rabrabracad
23+
*
24+
* % python kmp.py abacad abacadabrabracabracadabrabrabracad
25+
* text: abacadabrabracabracadabrabrabracad
26+
* pattern: abacad
27+
*
28+
"""
29+
30+
31+
class KMP:
32+
33+
def __init__(self, pattern):
34+
self.pattern = pattern
35+
self.R = 256
36+
M = len(pattern)
37+
self.dfa = [[0 for x in range(M)] for y in range(self.R)]
38+
self.dfa[self.char_at(pattern, 0)][0] = 1
39+
X = 0
40+
for j in range(1, M):
41+
for c in range(self.R):
42+
self.dfa[c][j] = self.dfa[c][X]
43+
self.dfa[self.char_at(pattern, j)][j] = j + 1
44+
X = self.dfa[self.char_at(pattern, j)][X]
45+
46+
def search(self, txt):
47+
N, M = len(txt), len(self.pattern)
48+
i, j = 0, 0
49+
while i < N and j < M:
50+
j = self.dfa[self.char_at(txt, i)][j]
51+
i += 1
52+
# Found (hit end of pattern)
53+
if j == M:
54+
return i - M
55+
# Not Found (hit end of text)
56+
return N
57+
58+
def char_at(self, s, d):
59+
return ord(s[d])
60+
61+
62+
if __name__ == "__main__":
63+
import sys
64+
pat, txt = sys.argv[1], sys.argv[2]
65+
kmp = KMP(pat)
66+
offset = kmp.search(txt)
67+
print("text: " + txt)
68+
print("pattern: ", end="")
69+
for i in range(offset):
70+
print(" ", end="")
71+
print(pat)

‎algs4/multiway.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
* Compilation: python multiway.py
2+
* Execution: python multiway.py
33
* Data files: https://algs4.cs.princeton.edu/24pq/m1.txt
44
* https://algs4.cs.princeton.edu/24pq/m2.txt
55
* https://algs4.cs.princeton.edu/24pq/m3.txt

0 commit comments

Comments
 (0)
Please sign in to comment.