首页 > 其他 > 详细

KMP匹配算法

时间:2014-01-28 21:10:44      阅读:447      评论:0      收藏:0      [点我收藏+]

KMP匹配算法,

原理参考http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

 

难点在于next数组的求解。

 

参考算法导论的思路求解next数组:

详见http://www.cnblogs.com/c-cloud/p/3224788.html

然后用Python实现了一下。

bubuko.com,布布扣
def makeNext(parttenString):
    next = []
    m = len(parttenString)
    k = 0
    next.append(0)
    p = 1
    while p < m:
        while k > 0 and parttenString[k] != parttenString[p]:
            k = next[k - 1]
        if parttenString[k] == parttenString[p]:
            k += 1

        next.append(k)
        p += 1
    print "nextval = ",next
    return next

def KMPAlgorithm(parttenString,rawString):
    nextval = makeNext(parttenString)
    isContain = False
    locationInRawString = 0
    locationInparttenString = 0
    lengthOfPartten = len(parttenString)
    lengthOfrawString = len(rawString)
    print lengthOfrawString,lengthOfPartten
    sameChar = 0
    while isContain == False:
        print locationInRawString,locationInparttenString
        while locationInparttenString < lengthOfPartten and locationInRawString < lengthOfrawString and parttenString[locationInparttenString] == rawString[locationInRawString]:
            if locationInparttenString == lengthOfPartten - 1:
                isContain = True
                break
            else:
                locationInRawString += 1
                locationInparttenString += 1
                sameChar += 1
        if lengthOfPartten - 1 == locationInparttenString and locationInRawString != lengthOfrawString - 1:
            break
        elif parttenString[locationInparttenString] != rawString[locationInRawString]:
            locationInRawString += 1
        else:
            locationInparttenString = locationInparttenString - (sameChar - nextval[locationInparttenString - 1])
            sameChar = 0
            if locationInRawString >= lengthOfrawString:
                break
    return isContain

if __name__ == "__main__":
    print KMPAlgorithm(CDAA,ABCDABCD)
bubuko.com,布布扣

KMP匹配算法

原文:http://www.cnblogs.com/lgy6534588/p/3535651.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!