leetcode 28 字符串匹配 O(N)复杂度解法

本文介绍了四种解决LeetCode 28题的字符串匹配算法,包括暴力法、回溯法以及两种KMP算法。重点讨论了KMP算法的二维dp数组和一维next数组实现,解释了如何避免回溯并实现O(N)的时间复杂度。KMP算法的关键在于构建转移状态图,通过next数组记录匹配信息,优化匹配过程。
摘要由CSDN通过智能技术生成

解法一:暴力
遍历长串,匹配到短串停止。此处提供一种比暴力稍好的策略,即不用每次都往前查找匹配,只有最后一个字母和中间字母都匹配再查找,这样能优化很多复杂度,最优复杂度为O(N),最坏仍为O(N(N-M))

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if needle == '': return 0

        def judge(pos):
            if haystack[pos:pos+len(needle)] == needle:
                return 1
            return 0

        for idx, c in enumerate(haystack):
            if needle[0] == c:
                p1, p2 = int(len(needle)/2), (len(needle)-1)
                if idx + p2 < len(haystack) and needle[p2] == haystack[idx+p2] and needle[p1] == haystack[idx+p1]:
                    result = judge(idx)
                    if result: return idx

        return -1

解法二:回溯
从开始处匹配,若不对则回溯。回溯到哪个位置是关键,若继续进行,会忽略之前可能匹配的串,如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值