lintcode 萬用字元匹配 ac程式碼

飛翔的黃瓜發表於2017-07-28

今天在lintcode看到一道題,看了一下午的答案都沒看懂,深深的挫敗感,先記錄下來,日後在啃

實現支援'.''*'正規表示式匹配。

'.'匹配任意一個字母。

'*'匹配零個或者多個前面的元素。

匹配應該覆蓋整個輸入字串,而不僅僅是一部分。

需要實現的函式是:bool isMatch(const char *s, const char *p)

樣例

isMatch("aa","a") → false

isMatch("aa","aa") → true

isMatch("aaa","aa") → false

isMatch("aa", "a*") → true

isMatch("aa", ".*") → true

isMatch("ab", ".*") → true

isMatch("aab", "c*a*b") → true

2017/9/1號更新,今天又看了一遍,看懂了一些,這種做法屬於動態規劃,主線分為當前字母之後的一個字母是*和不是*的兩種情況,並且整體風格是遞迴的向後檢測匹配與否,每一個環節只用考慮當前的情況是否匹配,實在是一個好方法

class Solution {
public:
    /**
     * @param s: A string 
     * @param p: A string includes "." and "*"
     * @return: A boolean
     */
    bool isMatch(const char *s, const char *p) {
        // write your code here
        if(*p == '\0')
            return *s == '\0';
 
        if(*(p+1) != '*'){
            if((*p == '.' && *s != '\0') || *p == *s){//*s如果為結束符即使*p為.當前也不匹配
                return isMatch(s+1, p+1);
            }else{
                return false;
            }
        }else{
            while((*p == '.' && *s != '\0') || *p == *s){
                if(isMatch(s, p+2))//每個遇到*號都可以先把它跳過匹配後面的
                    return true;
                s++;//match one more *
            }
            return isMatch(s, p+2); //這是當前兩個字元不相等,尋找*後的字元與s是否相等的情況
        }
    }
};


相關文章