请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
public class Solution {
public boolean match(char[] str, char[] pattern)
{
//条件判断
if(str==null||pattern==null){
return false;
}
return matchCore(str,0,pattern,0);
}
private boolean matchCore(char[] str,int strIndex,char[] pattern,int pIndex){
//有效性检验
//str和pattern同时到达尾部,完成匹配,返回true
if(strIndex==str.length&&pIndex==pattern.length){
return true;
}
//str不到尾,pattern到尾部,返回false
if(strIndex!=str.length&&pIndex==pattern.length){
return false;
}
//模式第2个是*,且字符串第1个跟模式第1个匹配,分3种匹配模式;如不匹配,模式后移2位
if (pIndex + 1 < pattern.length && pattern[pIndex + 1] == '*') {
if(strIndex!=str.length&&str[strIndex]==pattern[pIndex]||strIndex!=str.length&&pattern[pIndex]=='.'){
//1.模式串后后移两位,相当于第一个匹配的字符被忽略掉,从字符串的下一个字符继续开始匹配
//2.字符串后移一位,模式串后移两位,相当于模式匹配一个字符
//3.字符串后移一位,模式串不动,因为模式串的第二个字符'*‘,可以匹配前面出现的多个字符
return matchCore(str,strIndex,pattern,pIndex+2)||matchCore(str,strIndex+1,pattern,pIndex+2)||
matchCore(str,strIndex+1,pattern,pIndex);
}else{
return matchCore(str,strIndex,pattern,pIndex+2);
}
}
//模式串第二个字符不是'*',并且两个串的第一个字符是匹配的
if(strIndex!=str.length&&str[strIndex]==pattern[pIndex]||strIndex!=str.length&&pattern[pIndex]=='.'){
return matchCore(str,strIndex+1,pattern,pIndex+1);
//否则,直接返回false
}else{
return false;
}
}
}