【劍指**】19.正則表達式匹配

19.正則表達式匹配

題目描述

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

思路分析

  • 正則表達式用有限狀態機的思想去做
  • 本題是簡化了的正則表達式,因此不用那麼複雜。
  • 注意 * 前面的單詞,指的是前1個單詞,而不是全部的單詞;
  • 具體的思路,看代碼中的註釋;

代碼

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if (str == NULL || pattern == NULL) return false;
        return matchCore(str, pattern);
    }

    bool matchCore(char* str, char* pattern) {
        // 匹配結束條件
        if (*str == '\0' && *pattern == '\0') return true;

        if (*str != '\0' && *pattern == '\0') return false;

        // 情況1 模式的字符的下一個字符是 *
        if (*(pattern + 1) == '*') {
            // 字符 * 前面的字符匹配成功了
            if (*str == *pattern || (*pattern == '.' && *str != '\0')) {
                return matchCore(str + 1, pattern + 2) // * 表示前面字符只出現1次
                    || matchCore(str, pattern + 2) // * 號表示前面字符出現0次
                    || matchCore(str + 1, pattern); // * 號表示前面字符出現多次
            }
            // 字符 * 前面的字符沒有匹配成功
            else {
                return matchCore(str, pattern + 2);
            }
        }
        // 情況2 模式字符的下一個字符不是 *
        else if (*str == *pattern || (*pattern == '.' && *str != '\0')){
            return matchCore(str + 1, pattern + 1);
        }
        return false;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章