Skip to content

Commit d84c43d

Browse files
committed
feat: add solutions to lc problem: No.2267
No.2267.Check if There Is a Valid Parentheses String Path
1 parent 29ae471 commit d84c43d

File tree

6 files changed

+371
-2
lines changed

6 files changed

+371
-2
lines changed

solution/2200-2299/2267.Check if There Is a Valid Parentheses String Path/README.md

+128-1
Original file line numberDiff line numberDiff line change
@@ -65,22 +65,149 @@
6565

6666
<!-- 这里可写通用的实现逻辑 -->
6767

68+
**方法一:记忆化搜索**
69+
6870
<!-- tabs:start -->
6971

7072
### **Python3**
7173

7274
<!-- 这里可写当前语言的特殊实现逻辑 -->
7375

7476
```python
75-
77+
class Solution:
78+
def hasValidPath(self, grid: List[List[str]]) -> bool:
79+
@lru_cache(None)
80+
def dfs(i, j, t):
81+
if grid[i][j] == '(':
82+
t += 1
83+
else:
84+
t -= 1
85+
if t < 0:
86+
return False
87+
if i == m - 1 and j == n - 1:
88+
return t == 0
89+
for x, y in [(i + 1, j), (i, j + 1)]:
90+
if x < m and y < n and dfs(x, y, t):
91+
return True
92+
return False
93+
94+
m, n = len(grid), len(grid[0])
95+
return dfs(0, 0, 0)
7696
```
7797

7898
### **Java**
7999

80100
<!-- 这里可写当前语言的特殊实现逻辑 -->
81101

82102
```java
103+
class Solution {
104+
private boolean[][][] vis;
105+
private char[][] grid;
106+
private int m;
107+
private int n;
108+
109+
public boolean hasValidPath(char[][] grid) {
110+
m = grid.length;
111+
n = grid[0].length;
112+
this.grid = grid;
113+
vis = new boolean[m][n][m + n];
114+
return dfs(0, 0, 0);
115+
}
116+
117+
private boolean dfs(int i, int j, int t) {
118+
if (vis[i][j][t]) {
119+
return false;
120+
}
121+
vis[i][j][t] = true;
122+
t += grid[i][j] == '(' ? 1 : -1;
123+
if (t < 0) {
124+
return false;
125+
}
126+
if (i == m - 1 && j == n - 1) {
127+
return t == 0;
128+
}
129+
int[] dirs = {0, 1, 0};
130+
for (int k = 0; k < 2; ++k) {
131+
int x = i + dirs[k], y = j + dirs[k + 1];
132+
if (x < m && y < n && dfs(x, y, t)) {
133+
return true;
134+
}
135+
}
136+
return false;
137+
}
138+
}
139+
```
140+
141+
### **C++**
142+
143+
```cpp
144+
bool vis[100][100][200];
145+
int dirs[3] = {1, 0, 1};
146+
147+
class Solution {
148+
public:
149+
bool hasValidPath(vector<vector<char>>& grid) {
150+
memset(vis, 0, sizeof(vis));
151+
return dfs(0, 0, 0, grid);
152+
}
153+
154+
bool dfs(int i, int j, int t, vector<vector<char>>& grid) {
155+
if (vis[i][j][t]) return false;
156+
vis[i][j][t] = true;
157+
t += grid[i][j] == '(' ? 1 : -1;
158+
if (t < 0) return false;
159+
int m = grid.size(), n = grid[0].size();
160+
if (i == m - 1 && j == n - 1) return t == 0;
161+
for (int k = 0; k < 2; ++k)
162+
{
163+
int x = i + dirs[k], y = j + dirs[k + 1];
164+
if (x < m && y < n && dfs(x, y, t, grid)) return true;
165+
}
166+
return false;
167+
}
168+
};
169+
```
83170

171+
### **Go**
172+
173+
```go
174+
func hasValidPath(grid [][]byte) bool {
175+
m, n := len(grid), len(grid[0])
176+
vis := make([][][]bool, m)
177+
for i := range vis {
178+
vis[i] = make([][]bool, n)
179+
for j := range vis[i] {
180+
vis[i][j] = make([]bool, m+n)
181+
}
182+
}
183+
var dfs func(int, int, int) bool
184+
dfs = func(i, j, t int) bool {
185+
if vis[i][j][t] {
186+
return false
187+
}
188+
vis[i][j][t] = true
189+
if grid[i][j] == '(' {
190+
t += 1
191+
} else {
192+
t -= 1
193+
}
194+
if t < 0 {
195+
return false
196+
}
197+
if i == m-1 && j == n-1 {
198+
return t == 0
199+
}
200+
dirs := []int{1, 0, 1}
201+
for k := 0; k < 2; k++ {
202+
x, y := i+dirs[k], j+dirs[k+1]
203+
if x < m && y < n && dfs(x, y, t) {
204+
return true
205+
}
206+
}
207+
return false
208+
}
209+
return dfs(0, 0, 0)
210+
}
84211
```
85212

86213
### **TypeScript**

solution/2200-2299/2267.Check if There Is a Valid Parentheses String Path/README_EN.md

+126-1
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,138 @@ Note that there may be other valid parentheses string paths.
6060
### **Python3**
6161

6262
```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)
6482
```
6583

6684
### **Java**
6785

6886
```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+
```
69154

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+
}
70195
```
71196

72197
### **TypeScript**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
bool vis[100][100][200];
2+
int dirs[3] = {1, 0, 1};
3+
4+
class Solution {
5+
public:
6+
bool hasValidPath(vector<vector<char>>& grid) {
7+
memset(vis, 0, sizeof(vis));
8+
return dfs(0, 0, 0, grid);
9+
}
10+
11+
bool dfs(int i, int j, int t, vector<vector<char>>& grid) {
12+
if (vis[i][j][t]) return false;
13+
vis[i][j][t] = true;
14+
t += grid[i][j] == '(' ? 1 : -1;
15+
if (t < 0) return false;
16+
int m = grid.size(), n = grid[0].size();
17+
if (i == m - 1 && j == n - 1) return t == 0;
18+
for (int k = 0; k < 2; ++k)
19+
{
20+
int x = i + dirs[k], y = j + dirs[k + 1];
21+
if (x < m && y < n && dfs(x, y, t, grid)) return true;
22+
}
23+
return false;
24+
}
25+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
func hasValidPath(grid [][]byte) bool {
2+
m, n := len(grid), len(grid[0])
3+
vis := make([][][]bool, m)
4+
for i := range vis {
5+
vis[i] = make([][]bool, n)
6+
for j := range vis[i] {
7+
vis[i][j] = make([]bool, m+n)
8+
}
9+
}
10+
var dfs func(int, int, int) bool
11+
dfs = func(i, j, t int) bool {
12+
if vis[i][j][t] {
13+
return false
14+
}
15+
vis[i][j][t] = true
16+
if grid[i][j] == '(' {
17+
t += 1
18+
} else {
19+
t -= 1
20+
}
21+
if t < 0 {
22+
return false
23+
}
24+
if i == m-1 && j == n-1 {
25+
return t == 0
26+
}
27+
dirs := []int{1, 0, 1}
28+
for k := 0; k < 2; k++ {
29+
x, y := i+dirs[k], j+dirs[k+1]
30+
if x < m && y < n && dfs(x, y, t) {
31+
return true
32+
}
33+
}
34+
return false
35+
}
36+
return dfs(0, 0, 0)
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class Solution {
2+
private boolean[][][] vis;
3+
private char[][] grid;
4+
private int m;
5+
private int n;
6+
7+
public boolean hasValidPath(char[][] grid) {
8+
m = grid.length;
9+
n = grid[0].length;
10+
this.grid = grid;
11+
vis = new boolean[m][n][m + n];
12+
return dfs(0, 0, 0);
13+
}
14+
15+
private boolean dfs(int i, int j, int t) {
16+
if (vis[i][j][t]) {
17+
return false;
18+
}
19+
vis[i][j][t] = true;
20+
t += grid[i][j] == '(' ? 1 : -1;
21+
if (t < 0) {
22+
return false;
23+
}
24+
if (i == m - 1 && j == n - 1) {
25+
return t == 0;
26+
}
27+
int[] dirs = {0, 1, 0};
28+
for (int k = 0; k < 2; ++k) {
29+
int x = i + dirs[k], y = j + dirs[k + 1];
30+
if (x < m && y < n && dfs(x, y, t)) {
31+
return true;
32+
}
33+
}
34+
return false;
35+
}
36+
}

0 commit comments

Comments
 (0)