192. 通配符匹配
题目描述:
判断两个可能包含通配符“?”和“*”的字符串是否匹配。匹配规则如下:
'?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。
两个串完全匹配才算匹配成功。
函数接口如下:
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
思路:动态规划
1 class Solution { 2 public: 3 /** 4 * @param s: A string 5 * @param p: A string includes "?" and "*" 6 * @return: is Match? 7 */ 8 bool isMatch(string &s, string &p) { 9 vector<vector<bool> > dp(s.size()+1, vector<bool>(p.size()+1, false)); 10 dp[0][0]=true; 11 for(int j=1; j<=p.size(); ++j)dp[0][j]=dp[0][j-1] && p[j-1]=='*'; 12 for(int i=1; i<=s.size(); ++i){ 13 for(int j=1; j<=p.size(); ++j){ 14 if(dp[i-1][j-1]==true){ 15 if(s[i-1]==p[j-1] || p[j-1]=='?')dp[i][j]=true; 16 } 17 if(dp[i][j-1]==true || dp[i-1][j]==true){ 18 if(p[j-1]=='*')dp[i][j]=true; 19 } 20 } 21 } 22 return dp[s.size()][p.size()]; 23 } 24 };