该题创建一个矩阵 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]; } };