src/kmp.py
author Eugen Sawin <sawine@me73.com>
Wed, 06 Jul 2011 17:00:17 +0200
changeset 10 a3feee84f858
parent 9 15594952470f
permissions -rw-r--r--
Exercise 7.
     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    
     9     for x in range(len(args.text)): 
    10         pad = ""
    11         for p in range(2 - len(str(x))):
    12             pad += " "
    13         print str(x) + pad,
    14     print
    15     #print " ".join([str(i) for i in range(len(args.text))]) 
    16     for x in range(len(args.text)): 
    17         pad = " "
    18         print args.text[x] + pad,
    19     #for i in range(len(args.text)):
    20     #    pad = ""
    21     #    for x in range(1, len(str(i))):
    22     #        pad += " "
    23     #    print args.text[i] + pad,
    24     print
    25     print kmp(args.text, args.pattern)
    26 
    27 def kmp(text, pattern):    
    28     l = []
    29     n = next(pattern)
    30     j = 0
    31     for i in range(len(text)):
    32         pad = ""
    33         for x in range(1, i-j+1):
    34             pad += "   "
    35         print pad + "  ".join(pattern[:j+1]),
    36         while j >= 0 and text[i] != pattern[j]:           
    37             j = n[j]
    38         j += 1
    39         if j == len(pattern):
    40             print " matched",
    41             l.append(i - len(pattern) + 1)
    42             j = n[j]
    43         print
    44     return l
    45 
    46 def next(pattern):
    47     n = [-1]
    48     j = -1
    49     for i in range(len(pattern)):        
    50         while j >= 0 and pattern[i] != pattern[j]:
    51             j = n[j]        
    52         j += 1
    53         n.append(j)        
    54     return n
    55 
    56 from argparse import ArgumentParser
    57 
    58 def parse_arguments():
    59     parser = ArgumentParser(description="KMP.")
    60     parser.add_argument("text", help="the text")
    61     parser.add_argument("pattern", help="the pattern")     
    62     return parser.parse_args()
    63 
    64 if __name__ == "__main__":
    65     main()