题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
解决:
“.”表示任意字符
"*"表示它前面的字符可以出现任意次(包括0次)
public boolean match(char[] str, char[] pattern){
if(str==null || pattern==null){
return false;
}
return matchCore(str,0,pattern,0);
}
public boolean matchCore(char[] str,int strIndex,char[] pattern,int patternIndex){
//str和pattern都到尾,匹配成功
if(strIndex==str.length && patternIndex==pattern.length){
return true;
}
//pattern先到尾,匹配失败
if(strIndex!=str.length && patternIndex==pattern.length){
return false;
}
//模式串的第二个字符是*,有三种情况
if(patternIndex+1<pattern.length && pattern[patternIndex+1]=='*'){
if((strIndex!=str.length && str[strIndex]==pattern[patternIndex])
|| (strIndex!=str.length &&pattern[patternIndex]=='.')){
//*匹配一个,在匹配str下一个
//模式串后移两位,*未匹配
//模式匹配了一个字符
return matchCore(str,strIndex+1,pattern,patternIndex)
|| matchCore(str,strIndex,pattern,patternIndex+2)
|| matchCore(str,strIndex+1,pattern,patternIndex+2);
}else{
//若不匹配,模式后移两位
return matchCore(str,strIndex,pattern,patternIndex+2);
}
}
//模式串第二个不是*,且字符串第一个和模式串第一个匹配,都后移一位,否则返回false
if((strIndex!=str.length && str[strIndex]==pattern[patternIndex])
|| (strIndex!=str.length && pattern[patternIndex]=='.')){
return matchCore(str,strIndex+1,pattern,patternIndex+1);
}
return false;
}
不要使用strIndex++,或++strIndex,会出错。