牛客網--正則表達式匹配(字符串)

題目:

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

知識點:

正則表達式:參考https://blog.csdn.net/qq_30034925/article/details/70216525

思路:

1、兩個都爲null時,不匹配

2、兩個數組下標

3、1)如果模式中第二個字符不是'*':

如果當前字符匹配或者當前模式字符是'.' :則繼續檢驗;否則返回false

2)如果模式中第二個字符是'*':

如果當前字符與模式中當前字符匹配:則字符向後移一位,模式中不變;(n個字符匹配)

如果當前字符與模式中當前字符匹配或模式中當前字符是'.':則字符向後移一位,模式中向後移兩位;(一個字符匹配)

如果模式中當前字符是'.'或沒有字符匹配:則字符向後移一位,模式中向後移兩位;(0個字符匹配)

答案:

public class Solution {
    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;
        }
        //模式第2個是*,且字符串第1個跟模式第1個匹配,分3種匹配模式;如不匹配,模式後移2位
        if(patternIndex+1<pattern.length && pattern[patternIndex+1]=='*'){
            //首先str長度不爲0,兩個字符相等,pattern的字符爲.
            if(strIndex != str.length && (pattern[patternIndex]==str[strIndex] || pattern[patternIndex]=='.')){
                 return matchCore(str,strIndex,pattern,patternIndex+2) || //pattern[patternIndex]=='.'時,匹配0個字符
                    matchCore(str,strIndex+1,pattern,patternIndex+2) ||//*代表一個字符
                    matchCore(str,strIndex+1,pattern,patternIndex);//*代表多個字符,繼續匹配下一個
            }else{
                return matchCore(str,strIndex,pattern,patternIndex+2);//匹配0個
            }
        }
        //模式第2個不是*,且字符串第1個跟模式第1個匹配,則都後移1位,否則直接返回false
        if(strIndex != str.length && (pattern[patternIndex]==str[strIndex] || pattern[patternIndex]=='.')){
            return matchCore(str,strIndex+1,pattern,patternIndex+1);
        }else{
            return false;
        }
    }
}

 

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