1. 程式人生 > 實用技巧 >LeetCode 10. 正則表示式匹配

LeetCode 10. 正則表示式匹配

leetcode acwing 新題解

由於"a*","*",""這些樣例的存在,原來y總的題解要更新,看一下新題解

演算法

(動態規劃)\(O(n^2)\)

時間複雜度

線性遍歷一遍,每次遍歷假如是`*``則進行\(n\)次遍歷,所以時間複雜度\(O(n^2)\)

空間複雜度

\(O(n^2)\)

class Solution {
public:
    const static int N = 40;
    bool f[N][N];

    bool isMatch(string s, string p) {
        // 當兩個都是空串,返回true
        if (p.empty() && s.empty()) return true;
        // 當只有一個是空串,返回false
        if (p.empty()) return false;

        int n = s.size(), m = p.size();
        // 是字串下標從1開始
        s = ' ' + s, p = ' ' + p;
        // 初始化
        f[0][0] = true;
        // i從0開始,但是i==0是不代表任何有效比較
        for (int i = 0; i <= n; i ++)
        {
            for (int j = 1; j <= m; j ++)
            {
                // 先行探測下一個字元是不是*,如果是的話本次狀態轉移留到下次進行
                if (j + 1 <= m && p[j + 1] == '*') continue;
                // 保證i不為0,才是有效比較,並且陣列也不會越界
                if (i && p[j] != '*') f[i][j] = f[i-1][j-1] && (s[i] == p[j] || p[j] == '.');
                // j>=2,保證當p == "*"的匹配不成功
                else if (p[j] == '*') f[i][j] = (j >= 2 && f[i][j-2]) || (i && f[i-1][j] && (s[i] == p[j-1] || p[j-1] == '.'));
            }
            
        }
        return f[n][m];
    }
};