src/kmp.py
author Eugen Sawin <sawine@me73.com>
Wed, 03 Aug 2011 21:39:33 +0200
changeset 17 3bc8335b09b0
parent 9 15594952470f
permissions -rw-r--r--
Keine Lust.
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()