class Solution:
def isMatch(self, s: str, p: str) -> bool:
if s is None or p is None:
return True
n = len(s)
m = len(p)
dp = [[False] * (m + 1) for _ in range(n + 1)]
dp[0][0] = True
for j in range(2, m + 1):
if p[j - 1] == '*':
dp[0][j] = dp[0][j - 2]
for i in range(1, n + 1):
for j in range(1, m + 1):
if p[j - 1] != '*':
if p[j - 1] == '.' or p[j - 1] == s[i - 1]:
dp[i][j] = dp[i - 1][j - 1]
else:
if p[j - 2] != '.' and p[j - 2] != s[i - 1]:
dp[i][j] = dp[i][j - 2]
else:
dp[i][j] = dp[i][j - 2] or dp[i][j - 1] or dp[i - 1][j]
return dp[n][m]
共以下 11 个回答
class Solution {
public boolean articleMatch(String s, String p) {
int m=s.length();
int n=p.length();
boolean[][] dp = new boolean[m+1][n+1];
dp[0][0] = true;
for(int i=2;i<n+1;i++){
if(p.charAt(i-1)‘‘){
dp[0][i] = dp[0][i-2];
}
}
for(int i=1;i<m+1;i++){
for(int j=1;j<n+1;j++){
if(p.charAt(j-1)!=’‘){
if(p.charAt(j-1)‘.’||p.charAt(j-1)s.charAt(i-1)){
dp[i][j] = dp[i-1][j-1];
}
}else{
if(p.charAt(j-2)!=s.charAt(i-1)&&p.charAt(j-2)!=’.’){
dp[i][j] = dp[i][j-2];
}else{
dp[i][j]=dp[i][j-2]||dp[i][j-1]||dp[i-1][j];
}
}
}
}
return dp[m][n];
}
动态规划时间复杂度:O(mn)
空间复杂度:O(mn)
时间复杂度:O(mn)
空间复杂度:O(mn)
好难。。。
【思路】DP,dp[i][j]代表s[:i]与p[:j]能否被匹配上
【复杂度】时间O(mn),空间O(mn)
好难
动态规划 官解
时间:O(mn)
空间:O(mn)
思路:动态规划——状态转移需要考虑空、非空,非空中又要考虑 ‘.’ 和 ‘*’ 两种情况
时间复杂度O(mn) 空间复杂度O(mn)
写不出来……自己不会推状态转移的情况
“`C++
bool isMatch(string s, string p) {
if (p.empty()) {
return s.empty();
}
}
“`