author | Eugen Sawin <sawine@me73.com> |
Mon, 04 Jul 2011 16:41:40 +0200 | |
changeset 9 | 15594952470f |
child 10 | a3feee84f858 |
permissions | -rw-r--r-- |
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@9 | 8 |
print kmp(args.text, args.pattern) |
sawine@9 | 9 |
|
sawine@9 | 10 |
def kmp(text, pattern): |
sawine@9 | 11 |
l = [] |
sawine@9 | 12 |
n = next(pattern) |
sawine@9 | 13 |
j = 0 |
sawine@9 | 14 |
for i in range(len(text)): |
sawine@9 | 15 |
while j >= 0 and text[i] != pattern[j]: |
sawine@9 | 16 |
#print "mismatch at text %i and pattern %i" % (i, j) |
sawine@9 | 17 |
#print "new pattern %i" % (n[j],) |
sawine@9 | 18 |
j = n[j] |
sawine@9 | 19 |
j += 1 |
sawine@9 | 20 |
if j == len(pattern): |
sawine@9 | 21 |
l.append(i - len(pattern) + 1) |
sawine@9 | 22 |
j = n[j] |
sawine@9 | 23 |
return l |
sawine@9 | 24 |
|
sawine@9 | 25 |
def next(pattern): |
sawine@9 | 26 |
n = [-1] |
sawine@9 | 27 |
j = -1 |
sawine@9 | 28 |
for i in range(len(pattern)): |
sawine@9 | 29 |
while j >= 0 and pattern[i] != pattern[j]: |
sawine@9 | 30 |
j = n[j] |
sawine@9 | 31 |
j += 1 |
sawine@9 | 32 |
n.append(j) |
sawine@9 | 33 |
return n |
sawine@9 | 34 |
|
sawine@9 | 35 |
from argparse import ArgumentParser |
sawine@9 | 36 |
|
sawine@9 | 37 |
def parse_arguments(): |
sawine@9 | 38 |
parser = ArgumentParser(description="KMP.") |
sawine@9 | 39 |
parser.add_argument("text", help="the text") |
sawine@9 | 40 |
parser.add_argument("pattern", help="the pattern") |
sawine@9 | 41 |
return parser.parse_args() |
sawine@9 | 42 |
|
sawine@9 | 43 |
if __name__ == "__main__": |
sawine@9 | 44 |
main() |