题意:
方法:
动态规划
思路:dp[i][j]表示字符串s的前i个字符与字符串p的前j个字符是否匹配。
状态转移方程:
1.当s[i-1]==p[j-1] || p[j-1]=='?'时,则匹配;
2.当p[j-1]=='*'时,则匹配空或单个字符;
3.否则,匹配失败。
class Solution {
public:
bool isMatch(const char *s, const char *p) {
int n1=strlen(s),n2=strlen(p);
int dp[1005][1005]={0};//dp[i][j]表示字符串s的前i个字符与字符串p的前j个字符是否匹配
dp[0][0]=1;//初始化
for(int i=1;i<=n2;i++){
dp[0][i]=dp[0][i-1]&&(p[i-1]=='*');
}
for(int i=1;i<=n1;i++){//二重循环
for(int j=1;j<=n2;j++){
if(s[i-1]==p[j-1]||p[j-1]=='?'){//当s[i-1]==p[j-1]||p[j-1]=='?'时,则匹配
dp[i][j]=dp[i-1][j-1];
}else if(p[j-1]=='*'){//当p[j-1]=='*'时,则匹配空或至少一个字符
dp[i][j]=dp[i][j-1]||dp[i-1][j];
}else{//否则,匹配失败
dp[i][j]=0;
}
}
}
return dp[n1][n2]==1?true:false;
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号