LeetCode 正则表达式匹配

题目链接:https://leetcode-cn.com/problems/regular-expression-matching/

题目大意:

  略。

分析:

  这道题左神书上的解法不是最优的, 时间复杂度最优可以到O(NM)。
  请参见LeetCode官方题解.

代码如下:

 1 #define Rep(i,n) for (int i = 0; i < (int)(n); ++i)
 2 #define For(i,s,t) for (int i = (int)(s); i <= (int)(t); ++i)
 3 #define rFor(i,t,s) for (int i = (int)(t); i >= (int)(s); --i)
 4 #define ms0(a) memset(a,0,sizeof(a))
 5 
 6 class Solution {
 7 public:
 8     bool isMatch(string s, string p) {
 9         int N = s.size(), M = p.size();
10         // dp[i][j] 表示s[0~i-1]和p[0~j-1]是否匹配 
11         bool dp[N + 2][M + 2];
12         ms0(dp);
13 
14         dp[0][0] = 1; // 有 0 的代表空串,第0列其余必定为0 
15         if(p[0] == '.' || p[0] == s[0]) dp[1][1] = 1; // 第1列其余必为0 
16 
17         For(j, 2, M) {
18             For(i, 0, N) {
19                 if(p[j - 1] != '*') {
20                     dp[i][j] = i && dp[i - 1][j - 1] && (p[j - 1] == '.' || s[i - 1] == p[j - 1]);
21                 }
22                 else {
23                     if(dp[i][j - 2]) dp[i][j] = dp[i][j - 2]; // p[j - 2]出现0次的情况
24                     else {// p[j - 2]出现0次以上的情况
25                         dp[i][j] = i && dp[i - 1][j] && (p[j - 2] == '.' || s[i - 1] == p[j - 2]);
26                     } 
27                 }
28             }
29         } 
30         
31         return dp[N][M];
32     }
33 };
View Code

 

posted @ 2019-09-03 17:33  梦樱羽  阅读(289)  评论(0编辑  收藏  举报
Live2D