需要注意通配符和正则表达式对 * 的处理:
- 正则里的
*是让前一个字符重复 0 次或多次。 - 通配符匹配(
*单独代表任意字符串)
10. 正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.'匹配任意单个字符'*'匹配零个或多个前面的那一个元素
返回一个布尔值,表示匹配是否覆盖整个输入字符串(而非部分)。
示例 1:
输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:s = "aa", p = "a*"
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:
输入:s = "ab", p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
提示:
1 <= s.length <= 201 <= p.length <= 20s只包含从a-z的小写字母。p只包含从a-z的小写字母,以及字符.和*。- 保证每次出现字符
*时,前面都匹配到有效的字符
const int N = 2003;
bool f[N][N];
class Solution {
public:
bool isMatch(string s, string p) {
int n = s.size(), m = p.size();
f[0][0] = true;
for(int i = 0; i <= n; i ++ ) {
for(int j = 1; j <= m; j ++ ) {
if(p[j - 1] == '*') {
f[i][j] = (f[i][j - 2] || (i >= 1 && f[i - 1][j] && (s[i - 1] == p[j - 2] || p[j - 2] == '.')));
}
else {
f[i][j] = (i >= 1 && f[i - 1][j - 1] && (s[i - 1] == p[j - 1] || p[j - 1] == '.'));
}
}
}
return f[n][m];
}
};
44. 通配符匹配
给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 '?' 和 '*' 匹配规则的通配符匹配:
'?'可以匹配任何单个字符。'*'可以匹配任意字符序列(包括空字符序列)。
判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。
示例 1:
输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:s = "aa", p = "*"
输出:true
解释:'*' 可以匹配任意字符串。
示例 3:
输入:s = "cb", p = "?a"
输出:false
解释:'?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
提示:
0 <= s.length, p.length <= 2000s仅由小写英文字母组成p仅由小写英文字母、'?'或'*'组成
const int N = 2003;
bool f[N][N]{0};
class Solution {
public:
bool isMatch(string s, string p) {
int n = s.size(), m = p.size();
f[0][0] = true;
for(int i = 0; i <= n; i ++ ) {
for(int j = 1; j <= m; j ++ ) {
if(p[j - 1] == '*') {
f[i][j] = f[i][j - 1] || (i >= 1 && f[i - 1][j]);
}
else {
f[i][j] = (i >= 1 && f[i - 1][j - 1] && (s[i - 1] == p[j - 1] || p[j - 1] == '?'));
}
}
}
return f[n][m];
}
};
2011

被折叠的 条评论
为什么被折叠?



