KMP算法

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

next数组还不是太理解,代码如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @time     : 2017/12/5 下午8:19
# @desc     :

def get_next(p):
    next = [0] * len(p)
    next[0] = -1
    i = 0
    k = -1

    while i < len(p)-1:
        if k == -1 or p[i] == p[k]:
            i += 1
            k += 1
            next[i] = k
        else:
            k = next[k]
    return next


def kmp(s, p):
    if len(p) == 0:
        return 0

    next = get_next(p)

    i, j = 0, 0

    while i < len(s) and j < len(p):
        if j == -1 or s[i] == p[j]:
            i += 1
            j += 1
        else:
            j = next[j]

    if j == len(p):
        return i - len(p)
    else:
        return -1


if __name__ == "__main__":
    next = get_next("abcbabca")
    res = kmp("abcdabcdabcde", "abcde")
    print res

  

转载于:https://www.cnblogs.com/cmhco/p/7992909.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值