思路:列出所有的分支情況,然後編寫:
(1)S結束,P經過處理(末尾如果剩下類似a*b*直接處理掉)也結束,true;
(2)S結束,P經過處理沒有結束,false;
(3)S未結束,P結束,false;
(4)S未結束,P未結束:
1)S當前字符與P當前字符匹配:
a. P下一個字符是'*',可能的移動方式有三種:S不移動,P移動兩位;S移動一位,P不移動;S移動一位,P移動兩位;
b. P下一個字符不是'*',只有一種情況:S移動一位,P移動一位;
2)S當前字符與P當前字符不匹配:
a. P下一個字符是'*',只有一種情況匹配成功:S不移動,P移動兩位;
經過1)和2)還沒有匹配成功的,匹配失敗。
public boolean isMatch(String s, String p) {
if(s==null||s.length()==0) return isMatchCore("",0,p,0);
return isMatchCore(s,0,p,0);
}
public boolean isMatchCore(String s, int strIndex, String p, int patIndex){
//字符串沒結束,模式結束了,false;
if(strIndex<s.length()&&patIndex>=p.length()) return false;
//字符串結束了,模式還有剩餘,先對模式處理
while(strIndex>=s.length()&&patIndex+1<p.length()&&p.charAt(patIndex+1)=='*')
patIndex+=2;
////二者都結束了,true;
if(strIndex>=s.length()&&(patIndex>=p.length())) return true;
////字符串結束了,模式仍有剩餘,false;
if(strIndex>=s.length()&&(patIndex<p.length())) return false;
if(s.charAt(strIndex)==p.charAt(patIndex)||p.charAt(patIndex)=='.'){
//當前字符匹配
if(patIndex+1<p.length()&&p.charAt(patIndex+1)=='*'){
//遇到*模式,三種移動方式
return isMatchCore(s, strIndex, p, patIndex+2)||
isMatchCore(s, strIndex+1, p, patIndex)||
isMatchCore(s, strIndex+1, p, patIndex+2);
}
//不是*模式的普通匹配
return isMatchCore(s, strIndex+1,p,patIndex+1);
}
else if(patIndex+1<p.length()&&p.charAt(patIndex+1)=='*'){
//未能匹配當前字符,但是當前是*模式
return isMatchCore(s, strIndex,p,patIndex+2);
}
return false;
}