28. 实现 strStr() (本题可以跳过)
因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会 好懂很多。
或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。
因为大家 算法能力还没到,细扣 很难的算法,会把自己绕进去,就算别人给解释,只会激发出更多的问题和疑惑。所以大家先了解大体过程,知道这么回事, 等自己有 算法基础和思维了,在看多看几遍视频,慢慢就理解了。
题目链接/文章讲解/视频讲解:代码随想录
第一想法
用两个指针,一个指向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)的字符串中,有多大长度的相同前缀后缀。
前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串。
后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。
劝退了 看不下去