44. 通配符匹配
下面这个解释的太好了,动态规划正则匹配一下就明白了
一个棋盘看懂动态规划(DP)思路;附Python代码
肝了一天,可算做出来了
思路就是上面链接的思路,但苦于边界条件总是出问题,导致一直在思考甚至绕了路
其实画图的话很明了
简单理解为,
- 如果遇见 *,那么可以照抄上面的复制下来继续进行遍历,表现在填表上来看就是可以在上面√正下方继续填表
- 如果遇见?,那么就看左上角是不是√就可以
- 如果遇见字符,判断条件 左上角=√&&当前字符匹配
class Solution {
public:
bool isMatch(string s, string p) {
if (s.empty()) {
for (int i = 0; i < p.size(); i++) {
if (p[i] != '*')
return false;
}
return true;
}
int row = p.size() + 1;
int col = s.size() + 1;
vector<vector<int>> map(row, vector<int>(col));
//初始化
switch (p[0])
{
case '*':
map[0] = vector<int>(col, 1);
break;
default:
map[0][0] = 1;
break;
}
for (int i = 1; i < row; i++){
for (int j = 1; j < col; j++) {
switch (p[i-1])
{
//如果当前是*的话,那么代表可以匹配的是上面的这个或者往后的都可以,所以应该是从上面的 1 开始
case '*':
//如果*代表的可以作为空串的话,必须要保证它和前面的可以连接的上,但是如果*是在开头的话就会连接不上,所以我们需要补充连接的条件
if (map[i - 1][0] == 1) {
j = 0;//对这一行都进行填充
while (j < col) map[i][j++] = 1;
}
else if (map[i - 1][j] == 1)
while (j < col) map[i][j++] = 1;
break;
case '?':
if (map[i - 1][j - 1] == 1)
map[i][j] = 1;
break;
default:
if (map[i - 1][j - 1] == 1 && p[i - 1] == s[j - 1])
map[i][j] = 1;
break;
}
}
}
return map[row - 1][col - 1];
}
};