题意:
给定一个字符串 (t) 和一个字符模式 (s) ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。
‘?’ 可以匹配任何单个字符。
‘*’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
给定串t和s,问是否能够匹配。
code:
class Solution {
public:
bool isMatch(string t, string s) {
int len1=s.size(),len2=t.size();
vector<vector<int> >d(len1+5,vector<int>(len2+5,0));//动态开辟内存
d[0][0]=1;
for(int i=1;i<=len1;i++){
if(s[i-1]=='*')d[i][0]=1;
else break;
}
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(s[i-1]==t[j-1]||s[i-1]=='?'||s[i-1]=='*'){
d[i][j]|=d[i-1][j-1];
}
if(s[i-1]=='*'){
d[i][j]|=d[i][j-1];
d[i][j]|=d[i-1][j];
}
}
}
return d[len1][len2];
return 0;
}
};
/*
dp[i][j]=0/1表示s串前i个字符和t串前j个字符是否能够匹配,
1.s[i-1]==t[j-1]||t[j-1]=='?'||t[j-1]=='*',那么d[i][j]|=d[i-1][j-1];
2.s[i-1]=='*',那么d[i][j]|=d[i-1][j],且d[i][j]|=d[i][j-1];
特殊样例:
"ho"
"**ho"
解决:
当s串开头为'*'时,设当前'*'为s[i],那么需要令d[i][0]=1.
*/