正则匹配 dp[i][j]表示s[:i]能都匹配到p[:j]
核心代码是
if p[j] == '*':
if p[j-1] == s[i] or p[j-1] == '.':
dp[i+1][j+1] = dp[i+1][j-1] or dp[i+1][j] or dp[i][j+1]
分别对应于匹配1个,0个和多个
class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
lp = len(p)
ls = len(s)
dp = [[0] * (lp+1) for i in range(ls+1)]
dp[0][0] = 1
for j in range(1,lp):
if p[j] == '*' and dp[0][j-1]==1:
dp[0][j+1] = 1
for i in range(ls):
for j in range(lp):
if p[j] == s[i] or p[j] == '.':
dp[i+1][j+1] = dp[i][j]
if p[j] == '*':
if p[j-1] == s[i] or p[j-1] == '.':
dp[i+1][j+1] = dp[i+1][j-1] or dp[i+1][j] or dp[i][j+1]
else:
dp[i+1][j+1] = dp[i+1][j-1]
return dp[ls][lp]==1