Description
Implement regular expression matching with support for '.'
and '*'
.
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
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", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
正则表达式匹配,其中'.'代表匹配单个任意字符,'*'代表匹配它前面的0个或多个元素。
解:
直接一直判断,递归可解,详情参考代码注释(网上和leetcode讨论区有dp解法)。
java代码:
class Solution {
public boolean isMatch(String s, String p) {
// p为空时
if (p.isEmpty()) return s.isEmpty();
// p的长度为1时,如果s为空或者p和s的第一个元素不相等,且p的第一个元素不是'.'时,匹配失败
// 否则p和s都去掉第一个元素继续匹配。
if (p.length() == 1){
if (s.isEmpty() || (s.charAt(0) != p.charAt(0) && p.charAt(0) != '.'))
return false;
else
return isMatch(s.substring(1), p.substring(1));
}
// p的长度大于1时,如果p的第二个元素不是'*',此时,如果s为空或者p和s的第一个元素不相等,且p的第一个元素不是'.'时,匹配失败
// 否则p和s都去掉第一个元素继续匹配。
if (p.charAt(1) != '*'){
if (s.isEmpty() || (s.charAt(0) != p.charAt(0) && p.charAt(0) != '.'))
return false;
else
return isMatch(s.substring(1), p.substring(1));
}
// p的长度大于1,且p的第二个元素是'*',如果s不空且,第一个字符匹配到时,此时有两种情况:
// 一、'*'前面的字符出现0次,则p去掉前两个元素,与s继续递归
// 二、与s的第一个字符匹配,则去掉s的第一个字符,继续与p递归。
while (!s.isEmpty() && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')){
if (isMatch(s, p.substring(2))) return true;
else s = s.substring(1);
}
// 上面情况全部都不是时,(p的第二个字符是'*',s为空,或者第一个字符没匹配到时),去掉p的前两个元素,继续匹配。
return isMatch(s, p.substring(2));
}
}