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 };

 

posted @ 2018-08-13 14:57  jeysin  阅读(153)  评论(0编辑  收藏  举报