LeetCode 44. 通配符匹配
题目描述
思路分析
解法一:双指针 + 贪心回溯(推荐)
核心思路:
?可匹配任意单字符,*可匹配任意长度字符串。- 用双指针扫描
s与p,记录最近的*位置与匹配到的起点。- 遇到不匹配时回退到最近
*,让*吃掉更多字符。
复杂度分析:
- 时间复杂度:O(m + n),其中 m、n 分别为字符串长度。
- 空间复杂度:O(1),仅使用常数额外变量。
class Solution {
public boolean isMatch(String s, String p) {
int i = 0;
int j = 0;
int star = -1;
int match = 0;
// 双指针贪心匹配
while (i < s.length()) {
if (j < p.length() && (p.charAt(j) == '?' || p.charAt(j) == s.charAt(i))) {
i++;
j++;
} else if (j < p.length() && p.charAt(j) == '*') {
star = j;
match = i;
j++;
} else if (star != -1) {
j = star + 1;
match++;
i = match;
} else {
return false;
}
}
while (j < p.length() && p.charAt(j) == '*') {
j++;
}
return j == p.length();
}
}
func isMatch(s string, p string) bool {
i, j := 0, 0
star := -1
match := 0
// 双指针贪心匹配
for i < len(s) {
if j < len(p) && (p[j] == '?' || p[j] == s[i]) {
i++
j++
} else if j < len(p) && p[j] == '*' {
star = j
match = i
j++
} else if star != -1 {
j = star + 1
match++
i = match
} else {
return false
}
}
for j < len(p) && p[j] == '*' {
j++
}
return j == len(p)
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 10. 正则表达式匹配 | 困难 | DP/贪心 |
| 97. 交错字符串 | 中等 | DP |
| 72. 编辑距离 | 困难 | DP |
| 115. 不同的子序列 | 困难 | DP |
| 139. 单词拆分 | 中等 | DP |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!