心路历程:
两个字符串匹配的问题基本都可以用动态规划解决,递推关系就是依次匹配下去
注意的点:
1、注意边界条件是匹配串needle到头,但是haystack不一定需要到头
2、这道题按照从i开始的字符串而不是从i结束的进行DP建模
解法:简单动态规划
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
n, m = len(haystack), len(needle)
@cache
def dp(i, j): # 以i开头的字符串是否与以j开头的匹配
if i == n - 1: # 这两个可以合并但是为了方便理解就不合并了
return haystack[i] == needle[j:]
if j == m - 1:
return haystack[i] == needle[j]
if haystack[i] == needle[j]:
return dp(i+1, j+1)
else:
return False
for i in range(n):
if dp(i, 0): return i
return -1