|
| 1 | +// Time: O(m * n) |
| 2 | +// Space: O(n) |
| 3 | + |
| 4 | +// dp, optimized from solution2 |
| 5 | +class Solution { |
| 6 | +public: |
| 7 | + bool hasValidPath(vector<vector<char>>& grid) { |
| 8 | + const int MAX_M = 100; |
| 9 | + const int MAX_N = 100;; |
| 10 | + if ((size(grid) + size(grid[0]) - 1) % 2 == 1) { |
| 11 | + return false; |
| 12 | + } |
| 13 | + vector<pair<int, int>> dp(size(grid[0]) + 1, pair(MAX_M + MAX_N, -(MAX_M + MAX_N))); |
| 14 | + for (int i = 0; i < size(grid); ++i) { |
| 15 | + dp[0] = !i ? pair(0, 0) : pair(MAX_M + MAX_N, -(MAX_M + MAX_N)); |
| 16 | + for (int j = 0; j < size(grid[0]); ++j) { |
| 17 | + const int d = (grid[i][j] == '(') ? 1 : -1; |
| 18 | + dp[j + 1] = {min(dp[j + 1].first, dp[j].first) + d, max(dp[j + 1].second, dp[j].second) + d}; |
| 19 | + if (dp[j + 1].second < 0) { |
| 20 | + dp[j + 1] = {MAX_M + MAX_N, -(MAX_M + MAX_N)}; |
| 21 | + } else { |
| 22 | + dp[j + 1].first = max(dp[j + 1].first, dp[j + 1].second % 2); |
| 23 | + } |
| 24 | + } |
| 25 | + } |
| 26 | + return dp.back().first == 0; |
| 27 | + } |
| 28 | +}; |
| 29 | + |
| 30 | + |
| 31 | +// Time: O((m * n) * (m + n) / 32) |
| 32 | +// Space: O(n * (m + n) / 32) |
| 33 | +// dp |
| 34 | +class Solution2 { |
| 35 | +public: |
| 36 | + bool hasValidPath(vector<vector<char>>& grid) { |
| 37 | + if ((size(grid) + size(grid[0]) - 1) % 2 == 1) { |
| 38 | + return false; |
| 39 | + } |
| 40 | + vector<bitset<100>> dp(size(grid[0]) + 1); |
| 41 | + for (int i = 0; i < size(grid); ++i) { |
| 42 | + dp[0][0] = !i; |
| 43 | + for (int j = 0; j < size(grid[0]); ++j) { |
| 44 | + dp[j + 1] = (grid[i][j] == '(') ? (dp[j] | dp[j + 1]) << 1: (dp[j] | dp[j + 1]) >> 1; |
| 45 | + } |
| 46 | + } |
| 47 | + return dp.back()[0]; |
| 48 | + } |
| 49 | +}; |
0 commit comments