思路:从前向后匹配,匹配成功的条件是字符串与模式的两个指针都移动到末尾:
(1)若当前字符与模式当前字符匹配:
a. 若模式当前字符之后跟的不是'*',那么字符串与模式同时移动一位指针;
b. 若模式当前字符之后跟的是'*',需要分为三种情况,只要有一种匹配成功即可:字符串指针不移动&模式指针移动两位;字符串指针移动一位&模式指针不移动;字符串指针移动一位&模式指针移动两位。
(2)若当前字符与模式当前字符不匹配并且模式当前字符后面跟的是'*':字符串指针不移动&模式指针移动两位。
(3)以上情况都不满足,返回false,检测完毕。
public static boolean matchCore(char[] str,int strStart, char[] pattern, int patternStart){
//字符串与模式的剩余未匹配长度
int strNotMatchLength=str.length-strStart;
int patternNotMatchLength=pattern.length-patternStart;
//字符串与模式都遍历结束
if(strNotMatchLength<=0&&patternNotMatchLength<=0) return true;
//字符串结束,模式有剩余,仅当模式剩余的是若干个"c*"才可能匹配
if(strNotMatchLength<=0&&patternNotMatchLength>0){
if(patternNotMatchLength>1&&pattern[patternStart+1]=='*'){
return matchCore(str,strStart,pattern,patternStart+2);
}
return false;
}
//字符串有剩余,模式无剩余
if(strNotMatchLength>0&&patternNotMatchLength<=0) return false;
//字符串与模式都有剩余,
//当前字符与模式当前字符匹配,后面是'*'分三种情况,不是'*'一种情况
if(str[strStart]==pattern[patternStart]||pattern[patternStart]=='.'){
if(patternStart+1<pattern.length&&pattern[patternStart+1]=='*'){
return matchCore(str,strStart,pattern,patternStart+2)||matchCore(str,strStart+1,pattern,patternStart)|| matchCore(str,strStart+1,pattern,patternStart+2);
}
return matchCore(str,strStart+1,pattern,patternStart+1);
}
//当前字符与模式当前字符不匹配,后面是'*'一种情况
else if(patternStart+1<pattern.length&&pattern[patternStart+1]=='*'){
return matchCore(str,strStart,pattern,patternStart+2);
}
return false;
}
public static boolean match(char[] str, char[] pattern){
if(str==null||pattern==null) return false;
return matchCore(str,0,pattern,0);
}