Hard
抖机灵,一下想到的就是,使用正则表达式求解正则表达式。
写一下代码,AC!
python3
import re
class Solution:
def isMatch(self, s: str, p: str) -> bool:
result = re.fullmatch(p, s)
return False if result == None else True
正经解法
这道题的正经解法,是使用dp来做
说一下解法思路吧,还是要细品一下,如果来给我一次机会也许我还是想不到使用dp来求解
text
,能够匹配index到j时的pattern
if str[i] == pattern[j] or pattern[j] == '.': dp[i][j]=dp[i-1][j-1]
相同的话我们当前的结果就是之前比配的结果if pattern[j] == '*'
分两种情况
*
都不考虑。那就是dp[i][j-2]
if str[i] == pattern[j-1] || pattern[j-1] == '.'
就是说,假如前一个pattern字符匹配成功,或者说是.
代表任意字符的话,值为dp[i-1][j]
False
如下图,我们可以用一个例子来推导一遍,验证我们的通项公式是正确的
尝试写一下代码,AC!
python3
class Solution:
def isMatch(self, s: str, p: str) -> bool:
dp = [[False for _ in range(len(p) + 1)] for _ in range(len(s) + 1)]
dp[0][0] = True
for c in range(1, len(p) + 1):
if p[c-1] == '*':
dp[0][c] = dp[0][c-2]
for i in range(1, len(s) + 1):
for j in range(1, len(p) + 1):
if s[i-1] == p[j-1] or p[j-1] == '.':
dp[i][j] = dp[i-1][j-1]
elif p[j-1] == '*':
k = False
if p[j-2] == s[i-1] or p[j-2] == '.':
k = dp[i-1][j]
dp[i][j] = k or dp[i][j-2]
return dp[-1][-1]