python实现字符串匹配算法BF,BF改,KMP

包含:BF,BF改进版本,KMP

BF:暴力搜索

BF改:当判断匹配失败的字符串是不是与首字母相同 若不同,继续BF算法; 若相同,直接将首字母移到当前位置

KMP:通过前缀与后缀发现待匹配字符串本身的特性,匹配失败时一次性移动多个字符以减少工作量

# hstring为长字符串;substring为待匹配的字符串
def bf(hstring: str, substring: str):
    hlen = len(hstring)
    slen = len(substring)
    if (hlen == 0) or (slen == 0) or (hlen < slen):
        return None
    for i in range(hlen - slen + 1):  # 母串逐一字符匹配
        is_find = True
        for j in range(slen):  # 循环子串
            if hstring[i + j] != substring[j]:
                is_find = False
                break  # 如果匹配失败,之前所做的所有匹配工作全部舍弃,转而开始母串下一个字符的重新匹配
        if is_find:
            return i
    return False


def bf_plus(hstring: str, substring: str):
    hlen = len(hstring)
    slen = len(substring)
    if (hlen == 0) or (slen == 0) or (hlen < slen):
        return None
    i = 0
    while i < hlen - slen:
        is_find = True
        for j in range(slen):  # 循环子串
            ch1 = hstring[i + j]
            ch2 = substring[j]
            if ch1 != ch2:
                is_find = False
                # 当匹配失败时,检查败的字符串是不是与首字母相同,若不同,继续BF算法;若相同,直接将首字母移到当前位置
                if (ch1 == substring[0]) and (j >= 1):
                    ipos = i + j
                    i = ipos - 1
                break
        i += 1
        if is_find:
            return i - 1
    return False


def KMP(hstring, substring):
    hlen = len(hstring)
    slen = len(substring)
    if (hlen == 0) or (slen == 0) or (hlen < slen):
        return None

    def get_move_list(string):  # 根据最长前缀与最长后缀判断移动的位置
        n = len(string)
        temp_move_list = [0]  # 只有一个字符填充为0
        j = 0
        for i in range(1, n):
            while j > 0 and string[i] != string[j]:
                j = temp_move_list[j]
            if string[i] == string[j]:
                j += 1
            temp_move_list.append(j)
        return temp_move_list

    move_list = get_move_list(substring)
    j = 0
    for i in range(hlen):
        while hstring[i] != substring[j] and j > 0:
            j = move_list[j - 1]  # 匹配失败,确定移动后的位置
        if hstring[i] == substring[j]:
            j += 1
            if j == slen:
                return i - slen + 1
    return False

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆萌的代Ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值