题目链接:https://leetcode.com/problems/wildcard-matching/description/
这里用DP思想的代码
bool isMatch(string s, string p) {
int m = s.length(), n = p.length();
vector<vector<bool> > dp(m + 1, vector<bool> (n + 1, false));
dp[0][0] = true;
for (int i = 0; i <= m; i++)
for (int j = 1; j <= n; j++)
if (p[j - 1] == '*')
dp[i][j] = dp[i][j-1]||(i>0&&dp[i-1][j]);
else dp[i][j] = i>0&&dp[i-1][j-1]&&(s[i-1]==p[j-1]||'?'==p[j-1]);
return dp[m][n];
}
其中当p[j-1]是*时,有两种状态可能转移过来
dp[i][j] = dp[i][j-1]||(i>0&&dp[i-1][j]);
1:*表示匹配空串。dp[i][j] = dp[i][j-1]
2:*表示匹配任意串,所以像是i-1在一直向前递归,不停的把责任丢给子问题,即根据上一个状态来推得。 dp[i][j] = i>0&&dp[i-1][j]
当p[j-1]不是*号时,只有一种转移
1:dp[i][j] = i>0&&dp[i-1][j-1]&&(s[i-1]==p[j-1]||'?'==p[j-1]),就要检查s[i-1]和p[j-1]是否匹配。
二维数组其实也不必要,可以简化成一维数组来表示dp数组;
借用leetcode大神代码如下
bool isMatch(string s, string p) {
int m = s.length(), n = p.length();
vector<bool> cur(m + 1, false);
cur[0] = true;
for (int j = 1; j <= n; j++) {
bool pre = cur[0];
cur[0] = cur[0] && p[j - 1] == '*';
for (int i = 1; i <= m; i++) {
bool temp = cur[i];
if (p[j - 1] != '*')
cur[i] = pre && (s[i - 1] == p[j - 1] || p[j - 1] == '?');
else cur[i] = cur[i - 1] || cur[i];
pre = temp;
}
}
return cur[m];
}
tips:此题与
10. Regular Expression Matching类似。