@@ -60,13 +60,138 @@ Note that there may be other valid parentheses string paths.
60
60
### ** Python3**
61
61
62
62
``` python
63
-
63
+ class Solution :
64
+ def hasValidPath (self , grid : List[List[str ]]) -> bool :
65
+ @lru_cache (None )
66
+ def dfs (i , j , t ):
67
+ if grid[i][j] == ' (' :
68
+ t += 1
69
+ else :
70
+ t -= 1
71
+ if t < 0 :
72
+ return False
73
+ if i == m - 1 and j == n - 1 :
74
+ return t == 0
75
+ for x, y in [(i + 1 , j), (i, j + 1 )]:
76
+ if x < m and y < n and dfs(x, y, t):
77
+ return True
78
+ return False
79
+
80
+ m, n = len (grid), len (grid[0 ])
81
+ return dfs(0 , 0 , 0 )
64
82
```
65
83
66
84
### ** Java**
67
85
68
86
``` java
87
+ class Solution {
88
+ private boolean [][][] vis;
89
+ private char [][] grid;
90
+ private int m;
91
+ private int n;
92
+
93
+ public boolean hasValidPath (char [][] grid ) {
94
+ m = grid. length;
95
+ n = grid[0 ]. length;
96
+ this . grid = grid;
97
+ vis = new boolean [m][n][m + n];
98
+ return dfs(0 , 0 , 0 );
99
+ }
100
+
101
+ private boolean dfs (int i , int j , int t ) {
102
+ if (vis[i][j][t]) {
103
+ return false ;
104
+ }
105
+ vis[i][j][t] = true ;
106
+ t += grid[i][j] == ' (' ? 1 : - 1 ;
107
+ if (t < 0 ) {
108
+ return false ;
109
+ }
110
+ if (i == m - 1 && j == n - 1 ) {
111
+ return t == 0 ;
112
+ }
113
+ int [] dirs = {0 , 1 , 0 };
114
+ for (int k = 0 ; k < 2 ; ++ k) {
115
+ int x = i + dirs[k], y = j + dirs[k + 1 ];
116
+ if (x < m && y < n && dfs(x, y, t)) {
117
+ return true ;
118
+ }
119
+ }
120
+ return false ;
121
+ }
122
+ }
123
+ ```
124
+
125
+ ### ** C++**
126
+
127
+ ``` cpp
128
+ bool vis[100 ][100 ][200 ];
129
+ int dirs[3 ] = {1, 0, 1};
130
+
131
+ class Solution {
132
+ public:
133
+ bool hasValidPath(vector<vector<char >>& grid) {
134
+ memset(vis, 0, sizeof(vis));
135
+ return dfs(0, 0, 0, grid);
136
+ }
137
+
138
+ bool dfs(int i, int j, int t, vector<vector<char>>& grid) {
139
+ if (vis[i][j][t]) return false;
140
+ vis[i][j][t] = true;
141
+ t += grid[i][j] == '(' ? 1 : -1;
142
+ if (t < 0) return false;
143
+ int m = grid.size(), n = grid[0].size();
144
+ if (i == m - 1 && j == n - 1) return t == 0;
145
+ for (int k = 0; k < 2; ++k)
146
+ {
147
+ int x = i + dirs[k], y = j + dirs[k + 1];
148
+ if (x < m && y < n && dfs(x, y, t, grid)) return true;
149
+ }
150
+ return false;
151
+ }
152
+ };
153
+ ```
69
154
155
+ ### ** Go**
156
+
157
+ ``` go
158
+ func hasValidPath (grid [][]byte ) bool {
159
+ m , n := len (grid), len (grid[0 ])
160
+ vis := make ([][][]bool , m)
161
+ for i := range vis {
162
+ vis[i] = make ([][]bool , n)
163
+ for j := range vis[i] {
164
+ vis[i][j] = make ([]bool , m+n)
165
+ }
166
+ }
167
+ var dfs func (int , int , int ) bool
168
+ dfs = func (i, j, t int ) bool {
169
+ if vis[i][j][t] {
170
+ return false
171
+ }
172
+ vis[i][j][t] = true
173
+ if grid[i][j] == ' (' {
174
+ t += 1
175
+ } else {
176
+ t -= 1
177
+ }
178
+ if t < 0 {
179
+ return false
180
+ }
181
+ if i == m-1 && j == n-1 {
182
+ return t == 0
183
+ }
184
+ dirs := []int {1 , 0 , 1 }
185
+ for k := 0 ; k < 2 ; k++ {
186
+ x , y := i+dirs[k], j+dirs[k+1 ]
187
+ if x < m && y < n && dfs (x, y, t) {
188
+ return true
189
+ }
190
+ }
191
+ return false
192
+ }
193
+ return dfs (0 , 0 , 0 )
194
+ }
70
195
```
71
196
72
197
### ** TypeScript**
0 commit comments