题目:
请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配
思路:动态规划,设dp[j][i] 为pattern前j个模式是否与s前i个相匹配的真值,即pattern[0…j-1]与s[0…i-1]匹配,则dp[j][i]为真,否则为假。
dp下标为j,i时,
当pattern[j-1]与s[i-1]相匹配,即pattern[j-1]==s[i-1] or pattern[j-1]==’.’时,dp的真值取决于dp[j-1][i-1],即前j-1个pattern,与前i-1个s是否相匹配。
当pattern[j-1]与s[i-1]不匹配,且 pattern[j-1]==’*’ ,这时可以分为‘*’前的一个字符是否与s[i-1]匹配。
不匹配,意味着 pattern[j-2]!=s[i-1]且pattern[j-2]!=’.’,dp[j][i]=dp[j-2][i],即取决于pattern开始到‘*’前两个字符与s[0…,i-1]是否匹配。
匹配,意味着pattern[j-2]==s[i-1]或pattern[j-2]==’.’,dp[j][i]=dp[j-1][i] or dp[j][i-1] or dp[j-2][i] ,即dp[j][i]取决于pattern[0…j-2]与s[0…i-1]是否匹配(a*匹配一个)和pattern[0…j-1]与s[0..i-2]是否匹配(a*匹配多个)以及pattern[0..j-2]与s[0…i-1]是否匹配(a*匹配0个)。
class Solution:
# s, pattern都是字符串
def match(self, s, pattern):
# write code here
ls=len(s)
lp=len(pattern)
dp=[[False]*(ls+1) for _ in range(lp+1)]
dp[0][0]=True
for j in range(1,lp+1):
if pattern[j-1]=='*':
dp[j][0]= dp[j-2][0]
for i in range(1,ls+1):
for j in range(1,lp+1):
if pattern[j-1]==s[i-1] or pattern=='.':
dp[j][i]=dp[j-1][i-1]
else:
if pattern[j-1]!=s[i-1] and pattern != '.':
dp[j][i]=dp[j-2][i]
else:
dp[j][i]=dp[j-2][i] or dp[j-1][i] or dp[j][i-1]
return dp[lp][ls]