题目链接: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 };