1. 程式人生 > 其它 >leetcode10 正則表示式匹配

leetcode10 正則表示式匹配

思路:

動態規劃。

實現:

 1 class Solution
 2 {
 3 public:
 4     bool dfs(string& s, string& p, int x, int y, vector<vector<int>>& dp)
 5     {
 6         int n = s.length(), m = p.length();
 7         if (x == n) 
 8         {
 9             bool res = false;
10             if (y == m) res = true
; 11 else 12 { 13 if (dp[x][y] != -1) return dp[x][y]; 14 if (y + 1 < m and p[y + 1] == '*') res = dfs(s, p, x, y + 2, dp); 15 else res = false; 16 } 17 return dp[x][y] = res; 18 } 19 if
(y == m) return x == n; 20 if (dp[x][y] != -1) return dp[x][y]; 21 bool res = false; 22 if (s[x] == p[y]) 23 { 24 if (y + 1 < m and p[y + 1] == '*') 25 { 26 res = dfs(s, p, x, y + 2, dp) or dfs(s, p, x + 1, y + 2, dp) or dfs(s, p, x + 1
, y, dp); 27 } 28 else 29 { 30 res = dfs(s, p, x + 1, y + 1, dp); 31 } 32 } 33 else if (p[y] == '.') 34 { 35 if (y + 1 < m and p[y + 1] == '*') 36 { 37 res = dfs(s, p, x, y + 2, dp) or dfs(s, p, x + 1, y + 2, dp) or dfs(s, p, x + 1, y, dp); 38 } 39 else res = dfs(s, p, x + 1, y + 1, dp); 40 } 41 else if (y + 1 < m and p[y + 1] == '*') res = dfs(s, p, x, y + 2, dp); 42 return dp[x][y] = res; 43 } 44 bool isMatch(string s, string p) 45 { 46 int n = s.length(), m = p.length(); 47 vector<vector<int>> dp(n + 1, vector<int>(m + 1, -1)); 48 return dfs(s, p, 0, 0, dp); 49 } 50 };