【LeetCode10】正則表達式匹配

思路:列出所有的分支情況,然後編寫:

(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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章