请实现一个函数用来匹配包括'.'和'*'的正则表达式。
模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。
例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
public class Solution {
public boolean match(char[] str, char[] pattern)
{
String s = String.valueOf(str);
String p = String.valueOf(pattern);
return helper(s,0,p,0);
}
private boolean helper(String s, int curs, String p, int curp) {
//两个都匹配完了肯定是对的
if(curs >= s.length() && curp >= p.length()) return true;
//正则完了字符串还没完肯定是错的
if(curs < s.length() && curp >= p.length()) return false;
if(curp + 1 < p.length() && p.charAt(curp + 1) =='*'){
//下一个是*
if(curs >= s.length()){
//字符串已经匹配完了,当前的x*取0个x,还不一定对错
return helper(s, curs, p, curp + 2);
}else{
if(s.charAt(curs) == p.charAt(curp) || p.charAt(curp) == '.'){
//如果正则和字符串的字符相等或者为.时,要看三种情况之一,
//一种是当前x*取0个x(可能后面还有x*),
//一种是当前字符匹配,之后的正则依然用当前的.
//一种是当前正则x*就只匹配当前字符
return helper(s, curs, p, curp + 2) || helper(s, curs + 1, p, curp) || helper(s, curs + 1, p, curp + 2);
}else{
//如果当前正则和当前字符没法匹配,那么只能看下一个正则是否匹配
return helper(s, curs, p, curp + 2);
}
}
}else{
if(curs >= s.length()) {
//如果当前正则不是x*,且字符串匹配完了,那么一定不匹配
return false;
}else{
if(s.charAt(curs) == p.charAt(curp) || p.charAt(curp) == '.'){
//字符和正则各用掉一个
return helper(s,curs + 1, p,curp + 1);
}else{
//只要有一个不匹配就是错
return false;
}
}
}
}
}