LeetCode之10 --- Regular Expression Matching

題目:

  ,

Implement regular expression matching with support for '.' and '*'.正則表達式

'.' Matches any single character.
'*' Matches zero or more of the preceding element.

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
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

題目大意:

  實現正則表達式的*和.符號,要求輸入兩個字符串,第一個爲原串,第二個爲匹配串。返回成功或失敗

思路:

  拿到題以後想到第一個思路就是進行暴力匹配,一個字符一個字符的進行匹配,一旦發現匹配成功就返回。此思路明顯有缺陷,第一個缺陷是*前的有可能出現屢次有可能一次都不出現,而上述簡單匹配明顯只能進行單一匹配。
  改進思路,對*前的字符在原串中用循環匹配完全部和這個相同的字符,而後再對不帶*的一個一個進行匹配。上述思路在提交的時候爆出一個BUG,就是當餘姚"aaa" "a*a"這種狀況時在第一個*前的a就把原串中的全部a都匹配完了,致使返回了false的結果。對此思路的改進就是要在繼續匹配時先對後邊的串進行預處理,因此就有了下邊這個思路(此代碼參考學長博客: http://blog.csdn.net/wwh578867817/article/details/46128599

代碼:

int isMatch(char *s, char *p)
{
    //遞歸出口判斷
    if (p[0] == '\0') {
        return s[0] == '\0';
    }

    //分狀況解決匹配問題,一種帶*一種不帶*
    if (p[1] == '*') { //帶*
        while (s[0] != '\0' && (p[0] == '.' || s[0] == p[0])) { //若是匹配成功
            if (isMatch(s, p + 2)) { //先把帶*的匹配掠過,對後邊的進行匹配
                return 1;
            }
            ++s;    //把s向後移動一位,而後再次匹配*前的元素(由於*前的元素可能出現屢次)
        }
        return isMatch(s, p + 2);   //繼續匹配剩下的
    } else {  //不帶*
        //若是匹配成功
        if (s[0] != '\0' && (p[0] == '.' || s[0] == p[0])) {
            return isMatch(s + 1, p + 1);   //遞歸下一個元素匹配
        } else { //沒有匹配成功
            return 0;
        }
    }
    
}


PS:此題好難。。。。好 塞~~
相關文章
相關標籤/搜索