1.题目描述
2.解题思路,这道题自己没做出来,看了官方的题解,感觉对自己来说确实是比较难想的。使用了动态规划的解决方案,这种方案看题解都不一定能看明白,不过有个评论画图讲解的非常明白。其实仔细看题解的话,会发现和之前做的最长回文差不多。也先是定义了一个二维数组,f[i][j],用来描述是否是字符串s中的前i个字符和匹配串中的前J个是否相同。这个相同的条件又取决于之前的数组的真真假假,从这里我们就能看出这是可以分解成为一个子问题的动态规划问题。这里附上官方的题解。我精简了一下。本人学习记录,如有侵权,联系作者删除。
不妨换个角度思考问题,字母+*代表的情况如下:
3.解题代码(官方题解)
class Solution:def isMatch(self, s: str, p: str) -> bool:m, n = len(s), len(p)def matches(i: int, j: int) -> bool:if i == 0:return Falseif p[j - 1] == '.':return Truereturn s[i - 1] == p[j - 1]f = [[False] * (n + 1) for _ in range(m + 1)]f[0][0] = Truefor i in range(m + 1):for j in range(1, n + 1):if p[j - 1] == '*':f[i][j] |= f[i][j - 2]if matches(i, j - 1):f[i][j] |= f[i - 1][j]else:if matches(i, j):f[i][j] |= f[i - 1][j - 1]return f[m][n]
学习记录用,有问题可以一块探讨。