sawine@9
|
1 |
"""
|
sawine@9
|
2 |
Author: Eugen Sawin <sawine@informatik.uni-freiburg.de>
|
sawine@9
|
3 |
"""
|
sawine@9
|
4 |
|
sawine@9
|
5 |
def main():
|
sawine@9
|
6 |
args = parse_arguments()
|
sawine@9
|
7 |
print "next ", next(args.pattern)
|
sawine@10
|
8 |
|
sawine@10
|
9 |
for x in range(len(args.text)):
|
sawine@10
|
10 |
pad = ""
|
sawine@10
|
11 |
for p in range(2 - len(str(x))):
|
sawine@10
|
12 |
pad += " "
|
sawine@10
|
13 |
print str(x) + pad,
|
sawine@10
|
14 |
print
|
sawine@10
|
15 |
#print " ".join([str(i) for i in range(len(args.text))])
|
sawine@10
|
16 |
for x in range(len(args.text)):
|
sawine@10
|
17 |
pad = " "
|
sawine@10
|
18 |
print args.text[x] + pad,
|
sawine@10
|
19 |
#for i in range(len(args.text)):
|
sawine@10
|
20 |
# pad = ""
|
sawine@10
|
21 |
# for x in range(1, len(str(i))):
|
sawine@10
|
22 |
# pad += " "
|
sawine@10
|
23 |
# print args.text[i] + pad,
|
sawine@10
|
24 |
print
|
sawine@9
|
25 |
print kmp(args.text, args.pattern)
|
sawine@9
|
26 |
|
sawine@10
|
27 |
def kmp(text, pattern):
|
sawine@9
|
28 |
l = []
|
sawine@9
|
29 |
n = next(pattern)
|
sawine@9
|
30 |
j = 0
|
sawine@9
|
31 |
for i in range(len(text)):
|
sawine@10
|
32 |
pad = ""
|
sawine@10
|
33 |
for x in range(1, i-j+1):
|
sawine@10
|
34 |
pad += " "
|
sawine@10
|
35 |
print pad + " ".join(pattern[:j+1]),
|
sawine@10
|
36 |
while j >= 0 and text[i] != pattern[j]:
|
sawine@9
|
37 |
j = n[j]
|
sawine@9
|
38 |
j += 1
|
sawine@9
|
39 |
if j == len(pattern):
|
sawine@10
|
40 |
print " matched",
|
sawine@9
|
41 |
l.append(i - len(pattern) + 1)
|
sawine@9
|
42 |
j = n[j]
|
sawine@10
|
43 |
print
|
sawine@9
|
44 |
return l
|
sawine@9
|
45 |
|
sawine@9
|
46 |
def next(pattern):
|
sawine@9
|
47 |
n = [-1]
|
sawine@9
|
48 |
j = -1
|
sawine@9
|
49 |
for i in range(len(pattern)):
|
sawine@9
|
50 |
while j >= 0 and pattern[i] != pattern[j]:
|
sawine@9
|
51 |
j = n[j]
|
sawine@9
|
52 |
j += 1
|
sawine@9
|
53 |
n.append(j)
|
sawine@9
|
54 |
return n
|
sawine@9
|
55 |
|
sawine@9
|
56 |
from argparse import ArgumentParser
|
sawine@9
|
57 |
|
sawine@9
|
58 |
def parse_arguments():
|
sawine@9
|
59 |
parser = ArgumentParser(description="KMP.")
|
sawine@9
|
60 |
parser.add_argument("text", help="the text")
|
sawine@9
|
61 |
parser.add_argument("pattern", help="the pattern")
|
sawine@9
|
62 |
return parser.parse_args()
|
sawine@9
|
63 |
|
sawine@9
|
64 |
if __name__ == "__main__":
|
sawine@9
|
65 |
main()
|