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