版权声明:本文为博主原创文章。尊重原创,转载请标明:转自http://blog.csdn.net/hk_john https://blog.csdn.net/Hk_john/article/details/79637011
该题创建一个矩阵 f(i,j)代表s的前i项可以和p的前j项匹配。
判断两个可能包含通配符“?”和“*”的字符串是否匹配。匹配规则如下:
'?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。 两个串完全匹配才算匹配成功。 函数接口如下: bool isMatch(const char *s, const char *p)
样例
一些例子:
isMatch("aa","a") → false isMatch("aa","aa") → true isMatch("aaa","aa") → false isMatch("aa", "*") → true isMatch("aa", "a*") → true isMatch("ab", "?*") → true isMatch("aab", "c*a*b") → false
class Solution {
public:
/**
* @param s: A string
* @param p: A string includes "?" and "*"
* @return: is Match?
*/
bool isMatch(string &s, string &p) {
// write your code here
int a=s.size(),b=p.size();
vector<vector<bool> > dp(a+1,vector<bool>(b+1,false));
dp[0][0]=true;
for(int j=1;j<=b;j++)
if(p[j-1]=='*'&&dp[0][j-1])
dp[0][j]=true;
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
if(p[j-1]=='*')
dp[i][j]=(dp[i-1][j]||dp[i][j-1])||dp[i-1][j-1];
else if(p[j-1]==s[i-1]||p[j-1]=='?'){
dp[i][j]=dp[i-1][j-1];
}
}
}
return dp[a][b];
}
};