劍指 正則表達式匹配

題目鏈接

首先,考慮特殊情況:
         1>兩個字符串都爲空,返回true
         2>當第一個字符串不空,而第二個字符串空了,返回false(因爲這樣,就無法
            匹配成功了,而如果第一個字符串空了,第二個字符串非空,還是可能匹配成
            功的,比如第二個字符串是“a*a*a*a*”,由於‘*’之前的元素可以出現0次,
            所以有可能匹配成功)
    之後就開始匹配第一個字符,這裏有兩種可能:匹配成功或匹配失敗。但考慮到pattern
    下一個字符可能是‘*’, 這裏我們分兩種情況討論:pattern下一個字符爲‘*’或
    不爲‘*’:
          1>pattern下一個字符不爲‘*’:這種情況比較簡單,直接匹配當前字符。如果
            匹配成功,繼續匹配下一個;如果匹配失敗,直接返回false。注意這裏的
            “匹配成功”,除了兩個字符相同的情況外,還有一種情況,就是pattern的
            當前字符爲‘.’,同時str的當前字符不爲‘\0’。
          2>pattern下一個字符爲‘*’時,稍微複雜一些,因爲‘*’可以代表0個或多個。
            這裏把這些情況都考慮到:
               a>當‘*’匹配0個字符時,str當前字符不變,pattern當前字符後移兩位,
                跳過這個‘*’符號;
               b>當‘*’匹配1個或多個時,str當前字符移向下一個,pattern當前字符
                不變。(這裏匹配1個或多個可以看成一種情況,因爲:當匹配一個時,
                由於str移到了下一個字符,而pattern字符不變,就回到了上邊的情況a;
                當匹配多於一個字符時,相當於從str的下一個字符繼續開始匹配)
    之後再寫代碼就很簡單了。

 

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if (*str == '\0' && *pattern == '\0')
            return true;
        if (*str != '\0' && *pattern == '\0')
            return false;
        //if the next character in pattern is not '*'
        if (*(pattern+1) != '*')
        {
            if (*str == *pattern || (*str != '\0' && *pattern == '.'))
                return match(str+1, pattern+1);
            else
                return false;
        }
        //if the next character is '*'
        else
        {
            if (*str == *pattern || (*str != '\0' && *pattern == '.'))
                return match(str, pattern+2) || match(str+1, pattern);
            else
                return match(str, pattern+2);
        }
    }
};

 

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