题目
查看官方答案后才会的,但官方答案依然显得晦涩难懂,结合本人理解对该题解答进行介绍。
答题
首先分三种情况,字符为[字符,“”, “.”],s为目标字符串,p为正则匹配节点,根据p去对s进行匹配,动态规划首先考虑状态转移方程,借助f[i][j]表示s中的前i个字符与p中的前j个字符的匹配情况。
1. 若p[j]为字符,则状态转移方程为:
2. 若p[j]为".“,其可以匹配任意s中的字符。
3. 若p[j]为”",则状态转移方程为:
综上所诉,得状态转移方程为:
代码如下
因为大部分编程语言中的字符串从0开始,我们的思路是从1开始,代码将考虑字符坐标问题
class Solution:
def isMatch(self, s: str, p: str) -> bool:
len_s, len_p = len(s), len(p)
f = [[False]*(len_p+1) for _ in range(len_s+1)] #全坐标赋值为false
f[0][0] = True # 空值相同为true
def match(i, j):
if i == 0:
return False
if p[j-1] == '.':
return True
return s[i-1] == p[j-1]
for i in range(len_s+1): # 考虑坐标问题
for j in range(1, len_p+1):
if p[j-1] == "*":
f[i][j] = f[i][j-2]
if match(i,j-1):
f[i][j] |= f[i-1][j]
else:
if match(i, j):
f[i][j] |= f[i-1][j-1]
return f[len_s][len_p]