原网址为https://leetcode.com/problems/wildcard-matching/description/
一、题目
Implement wildcard pattern matching with support for '?'
and '*'
.
'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
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:
vector<vector<bool> > match;
bool isMatch(string s, string p) {
match.resize(s.size() + 1);
for (int i = 0; i < match.size(); i++) match[i].resize(p.size() + 1);
for (int i = 0; i < s.size(); i++) {
match[i][p.size()] = false;
}
match[s.size()][p.size()] = true;
int startOfWildCard = 0;
for (int j = p.size() - 1; j >= 0; j--) {
if (p[j] != '*') {
startOfWildCard = j + 1;
break;
}
}
for (int j = startOfWildCard; j < p.size(); j++) {
match[s.size()][j] = true;
}
for (int j = 0; j < startOfWildCard; j++) {
match[s.size()][j] = false;
}
for (int i = s.size() - 1; i >=0; i--) {
for (int j = p.size() - 1; j >= 0; j--) {
if (p[j] == '*') {
match[i][j] = match[i + 1][j] || match[i][j + 1];
} else {
int firstMatch = p[j] == s[i] || p[j] == '?';
match[i][j] = firstMatch && match[i + 1][j + 1];
}
}
}
return match[0][0];
}
};