剑指Offer——JZ52.正则表达式匹配【递归 | DP】

题目传送门


在这里插入图片描述


AC-Code

#include <regex>
class Solution {
public:
    bool match(char* str, char* pattern) {
        if(str == NULL || pattern == NULL)    return false;
        return ans3(str, pattern);
    }
    bool ans1(char* str, char* pattern) {
        regex reg(pattern);
        return regex_match(str, reg);
    }
    
    bool ans2(char* s, char* p) {
        if(*s == '\0' && *p == '\0')    return true;
        if(*p == '\0')    return false;
        
        // 如果没有 '*'
        if (*(p + 1) != '*') {
            if (*s != '\0' && (*s == *p || *p == '.'))
                return match(s + 1, p + 1);
            else
                return false;
        }
        // 如果有 '*'
        else {
            bool ret = false;
            // 重复 1 次或多次
            if (*s != '\0' && (*s == *p || *p == '.'))
                ret = match(s + 1, p);
            // 重复 0 次
            return ret || match(s, p + 2);
        }
    }
    
    bool ans3(char* s, char* p) {
        int sn = strlen(s), pn = strlen(p);
        vector<vector<bool>> f(sn + 1, vector<bool>(pn + 1, 0));
        for (int i = 0; i <= sn; ++i) {
            for (int j = 0; j <= pn; ++j) {
                // 初始条件
                if (j == 0) f[i][j] = (i == 0);
                else {
                    // 如果没有 '*'
                    if (p[j - 1] != '*') {
                        if (i >= 1 && (s[i - 1] == p[j - 1] || p[j - 1] == '.')) 
                            f[i][j] = f[i - 1][j - 1];
                    }
                    // 如果有 '*'
                    else {
                        // 重复 0 次
                        if (j >= 2) 
                            f[i][j] = f[i][j - 2] ? f[i][j - 2] : f[i][j];
                        // 重复 1 次或者多次
                        if (i >= 1 && j >= 2 && (s[i - 1] == p[j - 2] || p[j - 2] == '.')) 
                            f[i][j] = f[i - 1][j] ? f[i - 1][j] : f[i][j];
                    }
                }
            }
        }
        return f[sn][pn];
    }
};

猜你喜欢

转载自blog.csdn.net/Q_1849805767/article/details/106858510