動手刷LeetCode-正則表達式匹配

正則表達式匹配

解題思路

解法一:動態規劃
class Solution {
public:
    bool isMatch(string s, string p) {
        // 動態規劃
         int ns = s.length();
        int np = p.length();
        if(p.empty()) return s.empty();
        vector<vector<bool>> dp(ns+1, vector<bool>(np+1, false));
        dp[0][0] = true;
        for(int i = 1; i <= np; i++){
            if(i-2 >= 0 && p[i-1] == '*' && p[i-2]){
                dp[0][i] = dp[0][i-2];
            }
        }
        
        for(int i = 1; i <= ns; i++){
            for(int j = 1; j <= np; j++){
                if(p[j-1] == s[i-1] || p[j-1] == '.')
                    dp[i][j] = dp[i-1][j-1];
                if(p[j-1] == '*'){
                    bool zero, one;
                    if(j-2 >= 0){
                        zero = dp[i][j-2];
                        one = (p[j-2] == s[i-1] || p[j-2] == '.') && dp[i-1][j];
                        dp[i][j] = zero || one;
                    }
                }
            }
        }
        return dp[ns][np];
    }
    
    // 遞歸比較
    bool isMatch2(string s, string p) {
        return helperMatch(s, p, 0, 0);
    }

    bool helperMatch(string &s, string &p, int i, int j){
        int ns = s.size();
        int np = p.size();
        if(np == j){
            if(ns == i) return true;
            return false;
        }
        bool one = false, zero = false;
        if(j + 1 < np && p[j+1] == '*'){  // 遇到*時
            zero = helperMatch(s, p, i, j+2);  // 使用0次
            if(!zero && (i < ns) && (p[j] == s[i] || p[j] == '.')){
                one = helperMatch(s, p, i+1, j);  // 使用多次
            }
            return zero || one;
        }else{
            if((i < ns) && (p[j] == s[i] || p[j] == '.')){
                return helperMatch(s, p, i+1, j+1);  // 當前字符正常匹配
            }else{
                return false;  // 不匹配
            }
        }
        return false;
        
    }
};

狀態機思想

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章