28 strStr
1 描述
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
示例 1:
输入:haystack = "sadbutsad", needle = "sad" 输出:0 解释:"sad" 在下标 0 和 6 处匹配。 第一个匹配项的下标是 0 ,所以返回 0 。
示例 2:
输入:haystack = "leetcode", needle = "leeto" 输出:-1 解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。
提示:
1 <= haystack.length, needle.length <= 104haystack和needle仅由小写英文字符组成
2 代码
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
def build_next(s):
next_ = [0] * len(s)
i, j = 0, 1
while j < len(s):
if s[i] == s[j]:
next_[j] = i + 1
i += 1
j += 1
else:
if i == 0:
next_[j] = 0
j += 1
else:
i = next_[i-1]
return next_
next_ = build_next(needle)
# print(next_)
i, j = 0, 0
while j < len(haystack):
if haystack[j] == needle[i]:
j += 1
i += 1
else:
if i == 0:
j += 1
else:
i = next_[i - 1]
if i == len(needle):
return j - i
return -1
3 总结
- (57 封私信 / 87 条消息) 如何更好地理解和掌握 KMP 算法? - 知乎 (zhihu.com)
- 本质上寻找公共最长前后缀用了两次
459.重复的子字符串
1 描述
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
- 输入: "abab"
- 输出: True
- 解释: 可由子字符串 "ab" 重复两次构成。
示例 2:
- 输入: "aba"
- 输出: False
示例 3:
- 输入: "abcabcabcabc"
- 输出: True
- 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
2 代码
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
def build_next(s):
next_ = [0] * len(s)
i, j = 0, 1
while j < len(s):
# print('---')
# print(s)
# print(next_)
# print(i, j)
if s[i] == s[j]:
next_[j] = i + 1
j += 1
i += 1
else:
if i == 0:
next_[j] = 0
j += 1
else:
i = next_[i - 1]
return next_
next_ = build_next(s)
sub_len = len(s) - next_[-1]
# print(next_)
return next_[-1] > 0 and sub_len > 0 and len(s) % sub_len == 0
3 总结
- 背思路
- 注意 i = next_[i-1]
372



被折叠的 条评论
为什么被折叠?



