朴素模式匹配与KMP算法详解(附上Python代码)

给定题目:找出一个字符串S中的子串T并输出起始位置,如果有多个起始位置,输出最小位置。
解法一:
思路:从字符串S开始遍历,如果遍历到字符串S[i:i+len(T)]与字符串T相等,那么即可输出起始位置。如果遍历到字符串尾,仍然没有找到,那么没有最小位置,输出None。
上代码:

"""
@:param朴素字符串匹配算法
题目:两个字符串S和T,假设T是子串,找出该子串在S中的位置。
思想:先用子串的第一个位置字符进行比较,匹配S中的第一位,T(2)匹配S(2)......如果有
一位没有匹配上,终止匹配,从T中的第二位开始匹配。
"""
def string_compare(S, T):
    i = 0
    index = None
    is_exists = False
    while i<len(S):
        if T == S[i:i+len(T)]:
            is_exists = True
            index = i
            break
        else:
            i = i+1
    return is_exists, index

if __name__ == '__main__':
    S = "googgoogle"
    T = "google"
    is_exists, index = string_compare(S,T)
    print(is_exists, (str(index)+":"+str(index+len(T))))
这个是一次次比较,有没有更简单的方法呢,答案肯定给的,KMP算法。
可能会问,什么是KMP算法哇。我们一步步看匹配情况。

Ref:
1、《大话数据结构》
2、

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值