Skip to content

Commit b13e1ef

Browse files
committed
feat: add solutions to lc problem: No.0079
No.0079.Word Search
1 parent 2816562 commit b13e1ef

File tree

6 files changed

+292
-108
lines changed

6 files changed

+292
-108
lines changed

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

Lines changed: 101 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -67,21 +67,19 @@ class Solution:
6767
def dfs(i, j, cur):
6868
if cur == len(word):
6969
return True
70-
if i < 0 or i >= m or j < 0 or j >= n or visited[i][j] or word[cur] != board[i][j]:
70+
if i < 0 or i >= m or j < 0 or j >= n or board[i][j] == '0' or word[cur] != board[i][j]:
7171
return False
72-
visited[i][j] = True
73-
next = cur + 1
74-
res = dfs(i + 1, j, next) or dfs(i - 1, j, next) or dfs(i, j + 1, next) or dfs(i, j - 1, next)
75-
visited[i][j] = False
76-
return res
77-
m, n = len(board), len(board[0])
78-
visited = [[False for _ in range(n)] for _ in range(m)]
79-
for i in range(m):
80-
for j in range(n):
81-
res = dfs(i, j, 0)
82-
if res:
72+
t = board[i][j]
73+
board[i][j] = '0'
74+
for a, b in [[0, 1], [0, -1], [-1, 0], [1, 0]]:
75+
x, y = i + a, j + b
76+
if dfs(x, y, cur + 1):
8377
return True
84-
return False
78+
board[i][j] = t
79+
return False
80+
81+
m, n = len(board), len(board[0])
82+
return any(dfs(i, j, 0) for i in range(m) for j in range(n))
8583
```
8684

8785
### **Java**
@@ -90,33 +88,37 @@ class Solution:
9088

9189
```java
9290
class Solution {
93-
private boolean[][] visited;
94-
9591
public boolean exist(char[][] board, String word) {
96-
int m = board.length, n = board[0].length;
97-
visited = new boolean[m][n];
98-
char[] chars = word.toCharArray();
92+
int m = board.length;
93+
int n = board[0].length;
9994
for (int i = 0; i < m; ++i) {
10095
for (int j = 0; j < n; ++j) {
101-
boolean res = dfs(board, i, j, chars, 0);
102-
if (res) return true;
96+
if (dfs(i, j, 0, m, n, board, word)) {
97+
return true;
98+
}
10399
}
104100
}
105101
return false;
106102
}
107103

108-
private boolean dfs(char[][] board, int i, int j, char[] chars, int cur) {
109-
if (cur == chars.length) return true;
110-
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) return false;
111-
if (visited[i][j] || board[i][j] != chars[cur]) return false;
112-
visited[i][j] = true;
113-
int next = cur + 1;
114-
boolean res = dfs(board, i + 1, j, chars, next)
115-
|| dfs(board, i - 1, j, chars, next)
116-
|| dfs(board, i, j + 1, chars, next)
117-
|| dfs(board, i, j - 1, chars, next);
118-
visited[i][j] = false;
119-
return res;
104+
private boolean dfs(int i, int j, int cur, int m, int n, char[][] board, String word) {
105+
if (cur == word.length()) {
106+
return true;
107+
}
108+
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word.charAt(cur)) {
109+
return false;
110+
}
111+
board[i][j] += 256;
112+
int[] dirs = {-1, 0, 1, 0, -1};
113+
for (int k = 0; k < 4; ++k) {
114+
int x = i + dirs[k];
115+
int y = j + dirs[k + 1];
116+
if (dfs(x, y, cur + 1, m, n, board, word)) {
117+
return true;
118+
}
119+
}
120+
board[i][j] -= 256;
121+
return false;
120122
}
121123
}
122124
```
@@ -177,6 +179,73 @@ function dfs(
177179
}
178180
```
179181

182+
### **C++**
183+
184+
```cpp
185+
class Solution {
186+
public:
187+
bool exist(vector<vector<char>>& board, string word) {
188+
int m = board.size(), n = board[0].size();
189+
for (int i = 0; i < m; ++i)
190+
for (int j = 0; j < n; ++j)
191+
if (dfs(i, j, 0, m, n, board, word))
192+
return true;
193+
return false;
194+
}
195+
196+
bool dfs(int i, int j, int cur, int m, int n, vector<vector<char>>& board, string& word) {
197+
if (cur == word.size()) return true;
198+
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word[cur]) return false;
199+
char t = board[i][j];
200+
board[i][j] = '0';
201+
vector<int> dirs = {-1, 0, 1, 0, -1};
202+
for (int k = 0; k < 4; ++k)
203+
{
204+
int x = i + dirs[k], y = j + dirs[k + 1];
205+
if (dfs(x, y, cur + 1, m, n, board, word)) return true;
206+
}
207+
board[i][j] = t;
208+
return false;
209+
}
210+
};
211+
```
212+
213+
### **Go**
214+
215+
```go
216+
func exist(board [][]byte, word string) bool {
217+
m, n := len(board), len(board[0])
218+
var dfs func(i, j, cur int) bool
219+
dfs = func(i, j, cur int) bool {
220+
if cur == len(word) {
221+
return true
222+
}
223+
if i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word[cur] {
224+
return false
225+
}
226+
t := board[i][j]
227+
board[i][j] = '0'
228+
dirs := []int{-1, 0, 1, 0, -1}
229+
for k := 0; k < 4; k++ {
230+
x, y := i+dirs[k], j+dirs[k+1]
231+
if dfs(x, y, cur+1) {
232+
return true
233+
}
234+
}
235+
board[i][j] = t
236+
return false
237+
}
238+
for i := 0; i < m; i++ {
239+
for j := 0; j < n; j++ {
240+
if dfs(i, j, 0) {
241+
return true
242+
}
243+
}
244+
}
245+
return false
246+
}
247+
```
248+
180249
### **...**
181250

182251
```

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

Lines changed: 101 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -56,54 +56,56 @@ class Solution:
5656
def dfs(i, j, cur):
5757
if cur == len(word):
5858
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]:
59+
if i < 0 or i >= m or j < 0 or j >= n or board[i][j] == '0' or word[cur] != board[i][j]:
6060
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:
61+
t = board[i][j]
62+
board[i][j] = '0'
63+
for a, b in [[0, 1], [0, -1], [-1, 0], [1, 0]]:
64+
x, y = i + a, j + b
65+
if dfs(x, y, cur + 1):
7266
return True
73-
return False
67+
board[i][j] = t
68+
return False
69+
70+
m, n = len(board), len(board[0])
71+
return any(dfs(i, j, 0) for i in range(m) for j in range(n))
7472
```
7573

7674
### **Java**
7775

7876
```java
7977
class Solution {
80-
private boolean[][] visited;
81-
8278
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();
79+
int m = board.length;
80+
int n = board[0].length;
8681
for (int i = 0; i < m; ++i) {
8782
for (int j = 0; j < n; ++j) {
88-
boolean res = dfs(board, i, j, chars, 0);
89-
if (res) return true;
83+
if (dfs(i, j, 0, m, n, board, word)) {
84+
return true;
85+
}
9086
}
9187
}
9288
return false;
9389
}
9490

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;
91+
private boolean dfs(int i, int j, int cur, int m, int n, char[][] board, String word) {
92+
if (cur == word.length()) {
93+
return true;
94+
}
95+
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word.charAt(cur)) {
96+
return false;
97+
}
98+
board[i][j] += 256;
99+
int[] dirs = {-1, 0, 1, 0, -1};
100+
for (int k = 0; k < 4; ++k) {
101+
int x = i + dirs[k];
102+
int y = j + dirs[k + 1];
103+
if (dfs(x, y, cur + 1, m, n, board, word)) {
104+
return true;
105+
}
106+
}
107+
board[i][j] -= 256;
108+
return false;
107109
}
108110
}
109111
```
@@ -164,6 +166,73 @@ function dfs(
164166
}
165167
```
166168

169+
### **C++**
170+
171+
```cpp
172+
class Solution {
173+
public:
174+
bool exist(vector<vector<char>>& board, string word) {
175+
int m = board.size(), n = board[0].size();
176+
for (int i = 0; i < m; ++i)
177+
for (int j = 0; j < n; ++j)
178+
if (dfs(i, j, 0, m, n, board, word))
179+
return true;
180+
return false;
181+
}
182+
183+
bool dfs(int i, int j, int cur, int m, int n, vector<vector<char>>& board, string& word) {
184+
if (cur == word.size()) return true;
185+
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word[cur]) return false;
186+
char t = board[i][j];
187+
board[i][j] = '0';
188+
vector<int> dirs = {-1, 0, 1, 0, -1};
189+
for (int k = 0; k < 4; ++k)
190+
{
191+
int x = i + dirs[k], y = j + dirs[k + 1];
192+
if (dfs(x, y, cur + 1, m, n, board, word)) return true;
193+
}
194+
board[i][j] = t;
195+
return false;
196+
}
197+
};
198+
```
199+
200+
### **Go**
201+
202+
```go
203+
func exist(board [][]byte, word string) bool {
204+
m, n := len(board), len(board[0])
205+
var dfs func(i, j, cur int) bool
206+
dfs = func(i, j, cur int) bool {
207+
if cur == len(word) {
208+
return true
209+
}
210+
if i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word[cur] {
211+
return false
212+
}
213+
t := board[i][j]
214+
board[i][j] = '0'
215+
dirs := []int{-1, 0, 1, 0, -1}
216+
for k := 0; k < 4; k++ {
217+
x, y := i+dirs[k], j+dirs[k+1]
218+
if dfs(x, y, cur+1) {
219+
return true
220+
}
221+
}
222+
board[i][j] = t
223+
return false
224+
}
225+
for i := 0; i < m; i++ {
226+
for j := 0; j < n; j++ {
227+
if dfs(i, j, 0) {
228+
return true
229+
}
230+
}
231+
}
232+
return false
233+
}
234+
```
235+
167236
### **...**
168237

169238
```
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution {
2+
public:
3+
bool exist(vector<vector<char>>& board, string word) {
4+
int m = board.size(), n = board[0].size();
5+
for (int i = 0; i < m; ++i)
6+
for (int j = 0; j < n; ++j)
7+
if (dfs(i, j, 0, m, n, board, word))
8+
return true;
9+
return false;
10+
}
11+
12+
bool dfs(int i, int j, int cur, int m, int n, vector<vector<char>>& board, string& word) {
13+
if (cur == word.size()) return true;
14+
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word[cur]) return false;
15+
char t = board[i][j];
16+
board[i][j] = '0';
17+
vector<int> dirs = {-1, 0, 1, 0, -1};
18+
for (int k = 0; k < 4; ++k)
19+
{
20+
int x = i + dirs[k], y = j + dirs[k + 1];
21+
if (dfs(x, y, cur + 1, m, n, board, word)) return true;
22+
}
23+
board[i][j] = t;
24+
return false;
25+
}
26+
};
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
func exist(board [][]byte, word string) bool {
2+
m, n := len(board), len(board[0])
3+
var dfs func(i, j, cur int) bool
4+
dfs = func(i, j, cur int) bool {
5+
if cur == len(word) {
6+
return true
7+
}
8+
if i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word[cur] {
9+
return false
10+
}
11+
t := board[i][j]
12+
board[i][j] = '0'
13+
dirs := []int{-1, 0, 1, 0, -1}
14+
for k := 0; k < 4; k++ {
15+
x, y := i+dirs[k], j+dirs[k+1]
16+
if dfs(x, y, cur+1) {
17+
return true
18+
}
19+
}
20+
board[i][j] = t
21+
return false
22+
}
23+
for i := 0; i < m; i++ {
24+
for j := 0; j < n; j++ {
25+
if dfs(i, j, 0) {
26+
return true
27+
}
28+
}
29+
}
30+
return false
31+
}

0 commit comments

Comments
 (0)