正則表達式的匹配 (Java / 劍指offer)

請實現一個函數用來匹配包括'.'和'*'的正則表達式。模式中的字符'.'表示任意一個字符,而'*'表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配

當模式中的第二個字符不是“*”時:

1、如果字符串第一個字符和模式中的第一個字符相匹配,那麼字符串和模式都後移一個字符,然後匹配剩餘的。

2、如果 字符串第一個字符和模式中的第一個字符相不匹配,直接返回false。

而當模式中的第二個字符是“*”時:

如果字符串第一個字符跟模式第一個字符不匹配,則模式後移2個字符,繼續匹配。如果字符串第一個字符跟模式第一個字符匹配,可以有3種匹配方式:

1、模式後移2字符,相當於x*被忽略;

2、字符串後移1字符,模式後移2字符;

3、字符串後移1字符,模式不變,即繼續匹配字符下一位,因爲*可以匹配多位;

這裏需要注意的是:Java裏,要時刻檢驗數組是否越界。

package Tree;

public class patchStrings {
    
    public boolean match(char[] str, char[] pattern){
        if(str == null || pattern==null){
            return false;
        }
        int strIndex = 0;
        int patternIndex = 0;
        return matchCore(str,strIndex, pattern,patternIndex);
    }

    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;
        }
        //模式第二個爲"*",且字符串第1個匹配,分三種匹配模式;如果不匹配,模式後移2
        if(patternIndex+1 < pattern.length && pattern[patternIndex + 1] == '*'){
            if((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || (pattern[patternIndex] == '.' && strIndex !=str.length)){
                //1,模式後移2,視爲x*匹配0個字符
                //2,視爲模式匹配1個字符
                //3,*匹配1個,再匹配str中的下一個
                return matchCore(str, strIndex, pattern, patternIndex+2)
                || matchCore(str, strIndex+1, pattern, patternIndex +2)
                ||matchCore(str, strIndex+1, pattern, patternIndex);
            }else{
                return matchCore(str, strIndex, pattern, patternIndex+2);
            }
        }
        //模式第2個不是*,且字符串第1個跟模式第1個匹配,則都後移1位,否則直接返回false
        if((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || (pattern[patternIndex] == '.' && strIndex != str.length)){
            return matchCore(str, strIndex+1, pattern, patternIndex+1);
        }
        return false;
    }
    public static void main(String[] args) {

        patchStrings ps = new patchStrings();
        String str="aaa";
        String pattern = "ab*ab*ac*a";
        char[] str1 = str.toCharArray();
        char[] str2 = pattern.toCharArray();
        System.out.println(ps.match(str1, str2));
    }
}

參考地址:https://www.nowcoder.com/profile/7312159/codeBookDetail?submissionId=16351982

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