【剑指**】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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章