算法复习 字符串匹配

参考(35条消息) 字符串匹配算法综述_arthur.dy.lee的博客-CSDN博客

 1. KMP算法:

"""
    字符串匹配算法
"""


# 1. KMP算法
def kmp(mom, son):
    next = nextarr(son)
    i = j = 0
    while i < len(mom) and j < len(son):
        if mom[i] == son[j] or j == -1:
            i += 1
            j += 1
        else:
            j = next[j]
    if j == len(son):
        return i - j
    return -1


def nextarr(s_str):
    next_ls = [0] * len(s_str)
    m = 1
    s = 0
    next_ls[0] = -1
    while m < len(s_str) - 1:
        if s_str[m] == s_str[s] or s == -1:
            m += 1
            s += 1
            next_ls[m] = s
        else:
            s = next_ls[s]
    return next_ls



mom_string = 'abcabcabd'
son_string = 'abcabd'
res1 = kmp(mom_string, son_string)
#res2 = sunday(mom_string, son_string)
print(res1)

2. sunday算法




# Sunday算法
def sunday(haystack, needle):
    if not needle:
        return 0
    lnd = len(needle)
    lnf = len(haystack)
    if lnd > lnf:
        return -1

    # 偏移表预处理
    dic ={v:lnd-k for k,v in enumerate(needle)}
    idx = 0

    while idx+lnd <= lnf:
        # 待匹配字符串
        str_cut = haystack[idx:idx+lnd]
        # 判断是否匹配
        if str_cut == needle:
            return idx
        elif idx+lnd == lnf:
            return -1
        else:
            # 不匹配情况下,根据下一个字符的偏移,移动idx
            nextc = haystack[idx+lnd]
            idx += dic[nextc] if dic.get(nextc) else lnd+1
    return -1


mom_string = 'abcabcabd'
son_string = 'abcabd'

res2 = sunday(mom_string, son_string)
print(res2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值