算法训练营day9

28. 实现 strStr() (本题可以跳过)

因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会 好懂很多。

或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。

因为大家 算法能力还没到,细扣 很难的算法,会把自己绕进去,就算别人给解释,只会激发出更多的问题和疑惑。所以大家先了解大体过程,知道这么回事, 等自己有 算法基础和思维了,在看多看几遍视频,慢慢就理解了。

. - 力扣(LeetCode)

题目链接/文章讲解/视频讲解:代码随想录

第一想法

用两个指针,一个指向needle,一个指向haystack,如果值都相等,用while循环是否一致,一致就返回,如果不一致,则重新比较

这里一开始比较的时候,left直接跳过了比较过得字符,导致一部分用例测试不过;让left不跳过比过得长字符,仅仅从下一个字符开始重新比较,修改后pass了

回头来看,这种方法是有点暴力解题

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if len(needle) > len(haystack):
            return -1
        
        left = 0
        right = 0
        res = 0
        while(left < len(haystack)):
            res = left
            while((left < len(haystack)) and (right < len(needle)) and (haystack[left] == needle[right])):
                left += 1
                right += 1
            if right == len(needle):
                return res
            else:
                right = 0
                left = res
            left += 1

        return -1    

代码随想录

KMP 不明觉厉,认真看一下吧

KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

前缀表是用来回退得,记录了模式串与主串不匹配的时候,模式串应该从那里开始重新匹配

前缀表的定义:记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。

前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串

后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串

劝退了 看不下去

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值