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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值