Skip to content

Commit 501e6d6

Browse files
committed
feat: add python and java solutions to leetcode problem: No.0079
See https://leetcode-cn.com/problems/word-search/
1 parent f333970 commit 501e6d6

File tree

8 files changed

+217
-111
lines changed

8 files changed

+217
-111
lines changed

lcof/面试题12. 矩阵中的路径/README.md

+37-42
Original file line numberDiff line numberDiff line change
@@ -33,71 +33,66 @@
3333

3434
## 解法
3535

36+
深度优先搜索 DFS 解决。
37+
3638
<!-- tabs:start -->
3739

3840
### **Python3**
3941

4042
```python
4143
class Solution:
4244
def exist(self, board: List[List[str]], word: str) -> bool:
43-
if not word:
44-
return False
45-
rows, cols = len(board), len(board[0])
46-
visited = [[False for _ in range(cols)] for _ in range(rows)]
47-
for i in range(rows):
48-
for j in range(cols):
49-
if self.visit(board, visited, i, j, rows, cols, word):
45+
def dfs(i, j, cur):
46+
if cur == len(word):
47+
return True
48+
if i < 0 or i >= m or j < 0 or j >= n or visited[i][j] or word[cur] != board[i][j]:
49+
return False
50+
visited[i][j] = True
51+
next = cur + 1
52+
res = dfs(i + 1, j, next) or dfs(i - 1, j, next) or dfs(i, j + 1, next) or dfs(i, j - 1, next)
53+
visited[i][j] = False
54+
return res
55+
m, n = len(board), len(board[0])
56+
visited = [[False for _ in range(n)] for _ in range(m)]
57+
for i in range(m):
58+
for j in range(n):
59+
res = dfs(i, j, 0)
60+
if res:
5061
return True
5162
return False
52-
53-
def visit(self, board, visited, i, j, rows, cols, word) -> bool:
54-
if not word:
55-
return True
56-
if i < 0 or j < 0 or i >= rows or j >= cols or visited[i][j] or board[i][j] != word[0]:
57-
return False
58-
visited[i][j] = True
59-
res = self.visit(board, visited, i - 1, j, rows, cols, word[1:]) or self.visit(board, visited, i + 1, j, rows, cols, word[1:]) or self.visit(board, visited, i, j - 1, rows, cols, word[1:]) or self.visit(board, visited, i, j + 1, rows, cols, word[1:])
60-
visited[i][j] = res
61-
return res
6263
```
6364

6465
### **Java**
6566

6667
```java
6768
class Solution {
69+
private boolean[][] visited;
70+
6871
public boolean exist(char[][] board, String word) {
69-
if (word == null || word.length() == 0) {
70-
return false;
71-
}
72-
int rows = board.length, cols = board[0].length;
73-
boolean[][] visited = new boolean[rows][cols];
74-
for (int i = 0; i < rows; ++i) {
75-
for (int j = 0; j < cols; ++j) {
76-
if (visit(board, visited, i, j, rows, cols, word)) {
77-
return true;
78-
}
72+
int m = board.length, n = board[0].length;
73+
visited = new boolean[m][n];
74+
char[] chars = word.toCharArray();
75+
for (int i = 0; i < m; ++i) {
76+
for (int j = 0; j < n; ++j) {
77+
boolean res = dfs(board, i, j, chars, 0);
78+
if (res) return true;
7979
}
8080
}
8181
return false;
8282
}
8383

84-
private boolean visit(char[][] board, boolean[][] visited, int i, int j, int rows, int cols, String word) {
85-
if (word.length() == 0) {
86-
return true;
87-
}
88-
if (i < 0 || j < 0 || i >= rows || j >= cols || visited[i][j] || board[i][j] != word.charAt(0)) {
89-
return false;
90-
}
91-
84+
private boolean dfs(char[][] board, int i, int j, char[] chars, int cur) {
85+
if (cur == chars.length) return true;
86+
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) return false;
87+
if (visited[i][j] || board[i][j] != chars[cur]) return false;
9288
visited[i][j] = true;
93-
String sub = word.substring(1);
94-
boolean res = visit(board, visited, i + 1, j, rows, cols, sub)
95-
|| visit(board, visited, i - 1, j, rows, cols, sub)
96-
|| visit(board, visited, i, j + 1, rows, cols, sub)
97-
|| visit(board, visited, i, j - 1, rows, cols, sub);
98-
visited[i][j] = res;
89+
int next = cur + 1;
90+
boolean res = dfs(board, i + 1, j, chars, next)
91+
|| dfs(board, i - 1, j, chars, next)
92+
|| dfs(board, i, j + 1, chars, next)
93+
|| dfs(board, i, j - 1, chars, next);
94+
visited[i][j] = false;
9995
return res;
100-
10196
}
10297
}
10398
```

lcof/面试题12. 矩阵中的路径/Solution.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ func exist(board [][]byte, word string) bool {
22
if len(board) == 0 {
33
return false
44
}
5-
//标记数组
5+
// 标记数组
66
isVisited := make([][]bool, len(board))
77
for i := 0; i < len(board); i++ {
88
isVisited[i] = make([]bool, len(board[0]))
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,30 @@
11
class Solution {
2+
private boolean[][] visited;
3+
24
public boolean exist(char[][] board, String word) {
3-
if (word == null || word.length() == 0) {
4-
return false;
5-
}
6-
int rows = board.length, cols = board[0].length;
7-
boolean[][] visited = new boolean[rows][cols];
8-
for (int i = 0; i < rows; ++i) {
9-
for (int j = 0; j < cols; ++j) {
10-
if (visit(board, visited, i, j, rows, cols, word)) {
11-
return true;
12-
}
5+
int m = board.length, n = board[0].length;
6+
visited = new boolean[m][n];
7+
char[] chars = word.toCharArray();
8+
for (int i = 0; i < m; ++i) {
9+
for (int j = 0; j < n; ++j) {
10+
boolean res = dfs(board, i, j, chars, 0);
11+
if (res) return true;
1312
}
1413
}
1514
return false;
1615
}
1716

18-
private boolean visit(char[][] board, boolean[][] visited, int i, int j, int rows, int cols, String word) {
19-
if (word.length() == 0) {
20-
return true;
21-
}
22-
if (i < 0 || j < 0 || i >= rows || j >= cols || visited[i][j] || board[i][j] != word.charAt(0)) {
23-
return false;
24-
}
25-
17+
private boolean dfs(char[][] board, int i, int j, char[] chars, int cur) {
18+
if (cur == chars.length) return true;
19+
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) return false;
20+
if (visited[i][j] || board[i][j] != chars[cur]) return false;
2621
visited[i][j] = true;
27-
String sub = word.substring(1);
28-
boolean res = visit(board, visited, i + 1, j, rows, cols, sub)
29-
|| visit(board, visited, i - 1, j, rows, cols, sub)
30-
|| visit(board, visited, i, j + 1, rows, cols, sub)
31-
|| visit(board, visited, i, j - 1, rows, cols, sub);
32-
visited[i][j] = res;
22+
int next = cur + 1;
23+
boolean res = dfs(board, i + 1, j, chars, next)
24+
|| dfs(board, i - 1, j, chars, next)
25+
|| dfs(board, i, j + 1, chars, next)
26+
|| dfs(board, i, j - 1, chars, next);
27+
visited[i][j] = false;
3328
return res;
34-
3529
}
3630
}
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
class Solution:
22
def exist(self, board: List[List[str]], word: str) -> bool:
3-
if not word:
4-
return False
5-
rows, cols = len(board), len(board[0])
6-
visited = [[False for _ in range(cols)] for _ in range(rows)]
7-
for i in range(rows):
8-
for j in range(cols):
9-
if self.visit(board, visited, i, j, rows, cols, word):
3+
def dfs(i, j, cur):
4+
if cur == len(word):
5+
return True
6+
if i < 0 or i >= m or j < 0 or j >= n or visited[i][j] or word[cur] != board[i][j]:
7+
return False
8+
visited[i][j] = True
9+
next = cur + 1
10+
res = dfs(i + 1, j, next) or dfs(i - 1, j, next) or dfs(i, j + 1, next) or dfs(i, j - 1, next)
11+
visited[i][j] = False
12+
return res
13+
m, n = len(board), len(board[0])
14+
visited = [[False for _ in range(n)] for _ in range(m)]
15+
for i in range(m):
16+
for j in range(n):
17+
res = dfs(i, j, 0)
18+
if res:
1019
return True
1120
return False
12-
13-
def visit(self, board, visited, i, j, rows, cols, word) -> bool:
14-
if not word:
15-
return True
16-
if i < 0 or j < 0 or i >= rows or j >= cols or visited[i][j] or board[i][j] != word[0]:
17-
return False
18-
visited[i][j] = True
19-
res = self.visit(board, visited, i - 1, j, rows, cols, word[1:]) or self.visit(board, visited, i + 1, j, rows, cols, word[1:]) or self.visit(board, visited, i, j - 1, rows, cols, word[1:]) or self.visit(board, visited, i, j + 1, rows, cols, word[1:])
20-
visited[i][j] = res
21-
return res

solution/0000-0099/0079.Word Search/README.md

+52-2
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,72 @@
3939

4040
<!-- 这里可写通用的实现逻辑 -->
4141

42+
深度优先搜索 DFS 实现。
43+
4244
<!-- tabs:start -->
4345

4446
### **Python3**
4547

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

4850
```python
49-
51+
class Solution:
52+
def exist(self, board: List[List[str]], word: str) -> bool:
53+
def dfs(i, j, cur):
54+
if cur == len(word):
55+
return True
56+
if i < 0 or i >= m or j < 0 or j >= n or visited[i][j] or word[cur] != board[i][j]:
57+
return False
58+
visited[i][j] = True
59+
next = cur + 1
60+
res = dfs(i + 1, j, next) or dfs(i - 1, j, next) or dfs(i, j + 1, next) or dfs(i, j - 1, next)
61+
visited[i][j] = False
62+
return res
63+
m, n = len(board), len(board[0])
64+
visited = [[False for _ in range(n)] for _ in range(m)]
65+
for i in range(m):
66+
for j in range(n):
67+
res = dfs(i, j, 0)
68+
if res:
69+
return True
70+
return False
5071
```
5172

5273
### **Java**
5374

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

5677
```java
57-
78+
class Solution {
79+
private boolean[][] visited;
80+
81+
public boolean exist(char[][] board, String word) {
82+
int m = board.length, n = board[0].length;
83+
visited = new boolean[m][n];
84+
char[] chars = word.toCharArray();
85+
for (int i = 0; i < m; ++i) {
86+
for (int j = 0; j < n; ++j) {
87+
boolean res = dfs(board, i, j, chars, 0);
88+
if (res) return true;
89+
}
90+
}
91+
return false;
92+
}
93+
94+
private boolean dfs(char[][] board, int i, int j, char[] chars, int cur) {
95+
if (cur == chars.length) return true;
96+
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) return false;
97+
if (visited[i][j] || board[i][j] != chars[cur]) return false;
98+
visited[i][j] = true;
99+
int next = cur + 1;
100+
boolean res = dfs(board, i + 1, j, chars, next)
101+
|| dfs(board, i - 1, j, chars, next)
102+
|| dfs(board, i, j + 1, chars, next)
103+
|| dfs(board, i, j - 1, chars, next);
104+
visited[i][j] = false;
105+
return res;
106+
}
107+
}
58108
```
59109

60110
### **...**

solution/0000-0099/0079.Word Search/README_EN.md

+50-2
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,61 @@ Given word = &quot;<strong>ABCB</strong>&quot;, return <strong>false</strong>.
5151
### **Python3**
5252

5353
```python
54-
54+
class Solution:
55+
def exist(self, board: List[List[str]], word: str) -> bool:
56+
def dfs(i, j, cur):
57+
if cur == len(word):
58+
return True
59+
if i < 0 or i >= m or j < 0 or j >= n or visited[i][j] or word[cur] != board[i][j]:
60+
return False
61+
visited[i][j] = True
62+
next = cur + 1
63+
res = dfs(i + 1, j, next) or dfs(i - 1, j, next) or dfs(i, j + 1, next) or dfs(i, j - 1, next)
64+
visited[i][j] = False
65+
return res
66+
m, n = len(board), len(board[0])
67+
visited = [[False for _ in range(n)] for _ in range(m)]
68+
for i in range(m):
69+
for j in range(n):
70+
res = dfs(i, j, 0)
71+
if res:
72+
return True
73+
return False
5574
```
5675

5776
### **Java**
5877

5978
```java
60-
79+
class Solution {
80+
private boolean[][] visited;
81+
82+
public boolean exist(char[][] board, String word) {
83+
int m = board.length, n = board[0].length;
84+
visited = new boolean[m][n];
85+
char[] chars = word.toCharArray();
86+
for (int i = 0; i < m; ++i) {
87+
for (int j = 0; j < n; ++j) {
88+
boolean res = dfs(board, i, j, chars, 0);
89+
if (res) return true;
90+
}
91+
}
92+
return false;
93+
}
94+
95+
private boolean dfs(char[][] board, int i, int j, char[] chars, int cur) {
96+
if (cur == chars.length) return true;
97+
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) return false;
98+
if (visited[i][j] || board[i][j] != chars[cur]) return false;
99+
visited[i][j] = true;
100+
int next = cur + 1;
101+
boolean res = dfs(board, i + 1, j, chars, next)
102+
|| dfs(board, i - 1, j, chars, next)
103+
|| dfs(board, i, j + 1, chars, next)
104+
|| dfs(board, i, j - 1, chars, next);
105+
visited[i][j] = false;
106+
return res;
107+
}
108+
}
61109
```
62110

63111
### **...**

0 commit comments

Comments
 (0)