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
通配符匹配问题,和10. Regular Expression Matching 类似。'?'匹配1个字符,'*'匹配任何字符序列,包括空的。有贪心Greedy, 动态规划DP解法。
Java: Greedy, Iteration
public class WildcardMatching {
public boolean isMatch(String s, String p) {
int i = 0;
int j = 0;
int star = -1;
int mark = -1;
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;
j++;
mark = i;
//这一步是关键,匹配s中当前字符与p中‘*’后面的字符,如果匹配,则在第一个if中处理,如果不匹配,则继续比较s中的下一个字符。
} else if (star != -1) {
j = star + 1;
i = ++mark;
} else {
return false;
}
}
//最后在此处处理多余的‘*’,因为多个‘*’和一个‘*’意义相同。
while (j < p.length() && p.charAt(j) == '*') {
++j;
}
return j == p.length();
}
}
Python: Greedy, Iteration
class Solution:
def isMatch(self, s, p):
p_ptr, s_ptr, last_s_ptr, last_p_ptr = 0, 0, -1, -1
while s_ptr < len(s):
if p_ptr < len(p) and (s[s_ptr] == p[p_ptr] or p[p_ptr] == '?'):
s_ptr += 1
p_ptr += 1
elif p_ptr < len(p) and p[p_ptr] == '*':
p_ptr += 1
last_s_ptr = s_ptr
last_p_ptr = p_ptr
elif last_p_ptr != -1:
last_s_ptr += 1
s_ptr = last_s_ptr
p_ptr = last_p_ptr
else:
return False
while p_ptr < len(p) and p[p_ptr] == '*':
p_ptr += 1
return p_ptr == len(p)
类似题目:
[LeetCode] 10. Regular Expression Matching 正则表达式匹配
All LeetCode Questions List 题目汇总
来源:oschina
链接:https://my.oschina.net/u/4382082/blog/4249841