# 通配符匹配

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。

'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。

两个字符串完全匹配才算匹配成功。

说明:

示例 1:

输入:s = "aa"p = "a"
输出:
false
解释:
"a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:s = "aa"p = "*"
输出:
true
解释:
 '*' 可以匹配任意字符串。

示例 3:

输入:s = "cb"p = "?a"
输出:
false
解释:
 '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

示例 4:

输入:s = "adceb"p = "*a*b"
输出:
true
解释:
 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".

示例 5:

输入:s = "acdcb"p = "a*c?b"
输出:
false

以下错误的选项是?

## aop ### before ```cpp #include using namespace std; ``` ### after ```cpp int main() { Solution sol; string s = "adceb", p = "*a*b"; bool res; res = sol.isMatch(s, p); cout << res; return 0; } ``` ## 答案 ```cpp class Solution { public: bool isMatch(string s, string p) { if (s == "" && p == "" || (s == "" && p == "*")) return true; if (s == p) return true; int lens = s.length(); int lenp = p.length(); bool questionm = false, starm = false; for (int k = 0; k < lenp; k++) { if (p[k] == '?') questionm = true; if (p[k] == '*') starm = true; } if (lenp != lens && questionm == false && starm == false) return false; int i = 0, j = 0; int mstar, sstar = -1; while (i < lens) { if (j < lenp && p[j] == '*') { mstar = i; sstar = j; j += 1; } else if (sstar != -1) { mstar += 1; j = sstar + 1; i = mstar; } else return false; } while (j < lenp) { if (p[j] != '*') return false; j++; } return true; } }; ``` ## 选项 ### A ```cpp class Solution { public: bool isMatch(string s, string p) { int m = s.size(); int n = p.size(); vector> dp(m + 1, vector(n + 1)); dp[0][0] = true; for (int i = 1; i <= n; i++) { if (p[i - 1] == '*') dp[0][i] = true; else break; } for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { if (p[j - 1] == '*') { dp[i][j] |= dp[i][j - 1]; dp[i][j] |= dp[i - 1][j]; } else { if (p[j - 1] == '?' || s[i - 1] == p[j - 1]) { dp[i][j] |= dp[i - 1][j - 1]; } } } } return dp[m][n]; } }; ``` ### B ```cpp class Solution { public: bool isMatch(string s, string p) { vector> dp(s.size() + 1, vector(p.size() + 1)); dp[0][0] = 1; for (int j = 1; j <= p.size(); j++) { dp[0][j] = dp[0][j - 1] && p[j - 1] == '*'; } for (int i = 1; i <= s.size(); i++) { for (int j = 1; j <= p.size(); j++) { if (p[j - 1] == '*') { dp[i][j] = dp[i][j - 1] || dp[i - 1][j]; } else { dp[i][j] = (s[i - 1] == p[j - 1] || p[j - 1] == '?') && dp[i - 1][j - 1]; } } } return dp[s.size()][p.size()]; } }; ``` ### C ```cpp class Solution { public: bool isMatch(string s, string p) { if (p.empty()) return s.empty(); if (s.empty()) { if (p[0] == '*') return isMatch(s, p.substr(1)); else return false; } if (p[0] == '*') return isMatch(s, p.substr(1)) || isMatch(s.substr(1), p); else return (s[0] == p[0] || p[0] == '?') && isMatch(s.substr(1), p.substr(1)); } }; ```