算法:用了KMP算法节省时间、空间复杂度
不过代码还是不太会,只能解读正确代码
正确代码:
class Solution:
def getNext(self, next, s):
j = -1
next[0] = j
for i in range(1, len(s)):
while j >= 0 and s[i] != s[j+1]:
j = next[j]
if s[i] == s[j+1]:
j += 1
next[i] = j
def strStr(self, haystack: str, needle: str) -> int:
#首先,检查如果匹配串为空,则直接返回 0,因为一个空串是任何字符串的子串。
if not needle:
return 0
#然后,创建一个长度为匹配串长度的列表 `next`,并调用 `getNext` 函数来计算 `next` 列表。
next = [0] * len(needle)
self.getNext(next, needle)
#初始化变量 `j` 为 -1,并使用一个循环遍历待搜索的字符串 `haystack` 的每个位置。
j = -1
for i in range(len(haystack)):
#在循环中,使用一个 `while` 循环来不断更新变量 `j` 的值,直到 `j` 小于 0 或者当前字符 `haystack[i]` 等于匹配串 `needle` 中的字符 `needle[j+1]`。
while j >= 0 and haystack[i] != needle[j+1]:
#如果 `haystack[i]` 等于 `needle[j+1]`,则将 `j` 的值增加 1,表示找到了一个匹配。
j = next[j]
if haystack[i] == needle[j+1]:
j += 1
#然后,检查如果 `j` 的值等于匹配串的长度减 1,说明已经找到了完全匹配,返回匹配的起始位置 `i - len(needle) + 1`。
if j == len(needle) - 1:
#如果循环结束后仍未找到完全匹配,则返回 -1,表示未找到匹配。
return i - len(needle) + 1
return -1