题目
实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
'.' 匹配任意单个字符。
'*' 匹配零个或多个前面的元素。
匹配应该覆盖整个输入字符串(不是部分字符串)。
函数:
bool isMatch(const char *s, const char *p)
例子:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
分析
- 主要是*不好处理,这里使用递归的方式,分别尝试*为0-n 次的情况
- 递归处理时注意返回的条件,注意变量的变化和边界值的判断,是否越界
解题
class Solution {
public boolean isMatch(String s, String p) {
int sLen = s.length();
int pLen = p.length();
// pLen == 0
if(pLen == 0 ) {
return sLen == 0;
}
// pLen == 1
if (pLen == 1) {
return (sLen ==1) && (p.charAt(0) == s.charAt(00) || p.charAt(0) == '.');
}
// pLen >= 2
if (p.charAt(1) != '*') {
if (sLen == 0) {
return false;
}
return (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.') && isMatch(s.substring(1), p.substring(1));
} else {
while (sLen > 0 && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.')) {
if (isMatch(s, p.substring(2))) {
return true;
}
s = s.substring(1);
sLen = s.length();
}
return isMatch(s, p.substring(2));
}
}
}
启示
- 递归方法的运用
- 返回部分
- 递归部分
- 迭代部分
- 从基础开始着手
- null
- “”
- len = 0
- len = 1
- 注意是否越界
- 空串(0)
- 已循环到末尾(len)
- 循环的退出是否需要在退出后善后
- 结尾退出
- break 退出
- 条件不满退出