劍指offer 19:正則表達式匹配

題意

請實現一個函數用來匹配包括’.‘和’*‘的正則表達式。模式中的字符’.'表示任意一個字符,而‘*’表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配。題意說這是什麼非確定有限狀態機。不就是一堆小圈圈和剪頭嗎,不知道爲啥這麼高級的名字。

代碼

bool match(char *str, char *pattern) {
    bool is_match = false;
    //都等於0說明比較完了,正確
    if (*str == 0 && *pattern == 0)
        return true;
    //如果原句不空,pattern沒了,那肯定不對
    if (*str != 0 && *pattern == 0)
        return false;
    if (*(pattern + 1) == '*') {
        //當前和*之前的字符相同,或者pattern是.的時候
        if (*pattern == *str || *str != 0 && *pattern == '.')
            is_match = match(str + 1, pattern) ||//可以讓下一個字符和*之前的字符繼續比(代表着*之前是n>1次)
                       match(str, pattern + 2) || //可以跳過這個*的字符,對pattern的下一個字符比較(代表着*之前是0次)
                       match(str + 1, pattern + 2); // 可以跳過這個字符並且跳過這個pattern比較(代表*之前是1次),這個條件實際上可以去掉
        else //不相同就直接跳過這個*的字符
            is_match = match(str , pattern+2);

    } else if (*str == *pattern || *pattern == '.' && *str != 0) {
        //如果不是*的話就比這個字符就可以了
        is_match = match(str + 1, pattern + 1);
    }
    return is_match;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章