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.
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()