【难度:easy】
【时间复杂度:O(m + n)】
class Solution(object):
def strStr(self, haystack, needle):
"""
:type haystack: str
:type needle: str
:rtype: int
"""
# 回溯
if not needle:
return 0
if haystack == needle:
return 0
# neelen = len(needle)
# for i in range(len(haystack) - neelen + 1):
# if haystack[i:i + neelen] == needle:
# return i
# return -1
# KMP
dpnext = [0] * len(needle) # ABCDABD # [-1, 0,0,0,1,2]
dpnext[0] = -1
k = -1
j = 0
while j < len(needle) - 1:
if k == -1 or needle[k] == needle[j]:
j += 1
k += 1
dpnext[j] = k
else:
k = dpnext[k]
# print(dpnext)
i, j = 0, 0
while i < len(haystack) and j < len(needle):
if j == -1 or haystack[i] == needle[j]:
i += 1
j += 1
else:
j = dpnext[j]
if j >= len(needle):
return i - j
return -1