LeetCode 10. 正則表示式匹配
阿新 • • 發佈:2020-12-24
由於"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]; } };