LintCode (192)萬用字元匹配
阿新 • • 發佈:2019-01-10
題目
判斷兩個可能包含萬用字元“?”和“*”的字串是否匹配。匹配規則如下:
'?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個串完全匹配才算匹配成功。 函式介面如下: 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
分析
採用動態規劃解決,T(n)=o(mn)
程式碼
class Solution { public: /** * @param s: A string * @param p: A string includes "?" and "*" * @return: A boolean */ bool isMatch(const char *s, const char *p) { // write your code here if(s == NULL && p == NULL) return true; if(s == NULL || p == NULL) return false; int sLen = strlen(s); int pLen = strlen(p); vector<vector<int>> dp(sLen+1,vector<int>(pLen+1,0)); for(int i=1;i <=sLen ; ++i) { for(int j=1; j<=pLen; ++j) { dp[i][j] = 0; }//for }//for dp[0][0] = 1; for(int i=1; i<= sLen; ++i) { if(dp[i-1][0] == 1 && s[i-1] == '*') { dp[i][0] = 1; }else{ dp[i][0] = 0; }//else }//for for(int j=1; j<=pLen; ++j) { if(dp[0][j-1] == 1 && p[j-1] == '*') { dp[0][j] = 1; }else{ dp[0][j] = 0; }//else }//for for(int i=1;i<=sLen; ++i) { for(int j=1; j<=pLen; ++j) { if(s[i-1] == '*' || p[j-1] == '*'){ dp[i][j] = dp[i-1][j] || dp[i][j-1]; }else if(s[i-1] == '?' || p[j-1] == '?'){ dp[i][j] = dp[i-1][j-1]; }else { dp[i][j] = ((s[i-1] == p[j-1] ? 1 : 0) && dp[i-1][j-1]); }//else }//for }//for return dp[sLen][pLen]; } };