'.'表示任意一个字符
'*'表示前一个字符出现任意多次
考虑最优策略的最后一步,p的最后一个字符,1)是’.’ 或者 s[i-1] == p[j-1] 2)是’*’——>忽略*和不忽略*两种处理方式
状态:dp[i][j]代表s的前i个字符能否被p的前j个字符所匹配
转移方程:dp[i][j] = 1) dp[i-1][j-1] 2) dp[i][j-2] || dp[i-1][j] ( s[i-1] == p[j-2] || p[j-2] == ‘.' )
初始化条件:dp[0][0] = true; dp[i][0] = false; dp[0][i]需要带入公式计算 s = “” p = “a*"
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size();
int n = p.size();
vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));
dp[0][0] = true;
for(int i = 1; i <= m; i++){
dp[i][0] = false; //p为空
}
dp[0][1] = false; //如"" "*"; "" "a"
//当s为空,p不为空的时候有可能匹配
for(int i = 0; i <= m; i++){
for(int j = 1; j <= n; j++){
if(p[j-1] != '*'){
if(i > 0 && (p[j-1] == s[i-1] || p[j-1] == '.')){
dp[i][j] = dp[i-1][j-1];
}
}else{
if(j > 1){
dp[i][j] = dp[i][j-2];
}
if(i > 0 && j > 1&& (s[i-1] == p[j-2] || p[j-2] == '.')){
dp[i][j] = dp[i][j] || dp[i-1][j];
}
}
}
}
return dp[m][n];
}
};
leetcode 44 通配符匹配
'?'表示任意一个字符
'*'表示匹配任意字符串
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size();
int n = p.size();
vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));
dp[0][0] = true;
for(int i = 1; i <= m; i++){
dp[i][0] = false; //p为空
}
//当s为空,p不为空的时候有可能匹配
for(int i = 0; i <= m; i++){
for(int j = 1; j <= n; j++){
if(p[j-1] != '*'){
if(i > 0 && (s[i-1] == p[j-1] || p[j-1] == '?')){
dp[i][j] = dp[i-1][j-1];
}
}else{
dp[i][j] = dp[i][j-1];
if(i > 0){
dp[i][j] = dp[i][j] || dp[i-1][j];
}
}
}
}
return dp[m][n];
}
};