Skip to content

Commit 4a85faa

Browse files
committed
0079. Word Search
1 parent be693d8 commit 4a85faa

File tree

4 files changed

+292
-0
lines changed

4 files changed

+292
-0
lines changed

markdown/0079. Word Search.md

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
### [79\. Word Search](https://leetcode.com/problems/word-search/)
2+
3+
Difficulty: **Medium**
4+
5+
6+
Given a 2D board and a word, find if the word exists in the grid.
7+
8+
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
9+
10+
**Example:**
11+
12+
```
13+
board =
14+
[
15+
['A','B','C','E'],
16+
['S','F','C','S'],
17+
['A','D','E','E']
18+
]
19+
20+
Given word = "ABCCED", return true.
21+
Given word = "SEE", return true.
22+
Given word = "ABCB", return false.
23+
```
24+
25+
26+
#### Solution
27+
28+
Language: **Java**
29+
30+
```java
31+
class Solution {
32+
public boolean exist(char[][] board, String word) {
33+
if (board == null || board.length == 0) {
34+
return false;
35+
}
36+
int rows = board.length;
37+
int width = board[0].length;
38+
int[][] occupied = new int[rows][width];
39+
char[] chars = word.toCharArray();
40+
char firstChar = chars[0];
41+
for (int i = 0; i < rows; i++) {
42+
for (int j = 0; j < width; j++) {
43+
if (board[i][j] == firstChar) {
44+
occupied[i][j] = 1;
45+
if (existSubStr(board, occupied, chars, 1, i, j)) {
46+
return true;
47+
} else {
48+
occupied[i][j] = 0;
49+
}
50+
}
51+
}
52+
}
53+
return false;
54+
}
55+
56+
private boolean existSubStr(char[][] board, int[][] occupied, char[] chars, int startIndex, int i, int j) {
57+
if (startIndex >= chars.length) {
58+
return true;
59+
}
60+
char aChar = chars[startIndex];
61+
if (i + 1 < board.length && board[i + 1][j] == aChar && occupied[i + 1][j] == 0) {
62+
occupied[i + 1][j] = 1;
63+
if (existSubStr(board, occupied, chars, startIndex + 1, i + 1, j)) {
64+
return true;
65+
} else {
66+
occupied[i + 1][j] = 0;
67+
}
68+
}
69+
70+
if (i - 1 >= 0 && board[i - 1][j] == aChar && occupied[i - 1][j] == 0) {
71+
occupied[i - 1][j] = 1;
72+
if (existSubStr(board, occupied, chars, startIndex + 1, i - 1, j)) {
73+
return true;
74+
} else {
75+
occupied[i - 1][j] = 0;
76+
}
77+
}
78+
79+
80+
if (j + 1 < board[0].length && board[i][j + 1] == aChar && occupied[i][j + 1] == 0) {
81+
occupied[i][j + 1] = 1;
82+
if (existSubStr(board, occupied, chars, startIndex + 1, i, j + 1)) {
83+
return true;
84+
} else {
85+
occupied[i][j + 1] = 0;
86+
}
87+
}
88+
89+
if (j - 1 >= 0 && board[i][j - 1] == aChar && occupied[i][j - 1] == 0) {
90+
occupied[i][j - 1] = 1;
91+
if (existSubStr(board, occupied, chars, startIndex + 1, i, j - 1)) {
92+
return true;
93+
} else {
94+
occupied[i][j - 1] = 0;
95+
}
96+
}
97+
return false;
98+
}
99+
}
100+
```
101+
![pic](https://raw.githubusercontent.com/PicGoBed/PicBed/master/2019-07-26-jlr6zb.jpg)

src/main/java/leetcode/_79_/Main.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package leetcode._79_;
2+
3+
/**
4+
* Created by zhangbo54 on 2019-03-04.
5+
*/
6+
public class Main {
7+
public static void main(String[] args) {
8+
Solution solution = new Solution();
9+
char[][] board = {
10+
{'A', 'B', 'C', 'E'},
11+
{'S', 'F', 'C', 'S'},
12+
{'A', 'D', 'E', 'E'}};
13+
14+
System.out.println(solution.exist(board,"ABCCED"));
15+
System.out.println(solution.exist(board,"SEE"));
16+
System.out.println(solution.exist(board,"ABCB"));
17+
}
18+
}
19+
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package leetcode._79_;
2+
3+
class Solution {
4+
public boolean exist(char[][] board, String word) {
5+
if (board == null || board.length == 0) {
6+
return false;
7+
}
8+
int rows = board.length;
9+
int width = board[0].length;
10+
int[][] occupied = new int[rows][width];
11+
char[] chars = word.toCharArray();
12+
char firstChar = chars[0];
13+
for (int i = 0; i < rows; i++) {
14+
for (int j = 0; j < width; j++) {
15+
if (board[i][j] == firstChar) {
16+
occupied[i][j] = 1;
17+
if (existSubStr(board, occupied, chars, 1, i, j)) {
18+
return true;
19+
} else {
20+
occupied[i][j] = 0;
21+
}
22+
}
23+
}
24+
}
25+
return false;
26+
}
27+
28+
private boolean existSubStr(char[][] board, int[][] occupied, char[] chars, int startIndex, int i, int j) {
29+
if (startIndex >= chars.length) {
30+
return true;
31+
}
32+
char aChar = chars[startIndex];
33+
if (i + 1 < board.length && board[i + 1][j] == aChar && occupied[i + 1][j] == 0) {
34+
occupied[i + 1][j] = 1;
35+
if (existSubStr(board, occupied, chars, startIndex + 1, i + 1, j)) {
36+
return true;
37+
} else {
38+
occupied[i + 1][j] = 0;
39+
}
40+
}
41+
42+
if (i - 1 >= 0 && board[i - 1][j] == aChar && occupied[i - 1][j] == 0) {
43+
occupied[i - 1][j] = 1;
44+
if (existSubStr(board, occupied, chars, startIndex + 1, i - 1, j)) {
45+
return true;
46+
} else {
47+
occupied[i - 1][j] = 0;
48+
}
49+
}
50+
51+
52+
if (j + 1 < board[0].length && board[i][j + 1] == aChar && occupied[i][j + 1] == 0) {
53+
occupied[i][j + 1] = 1;
54+
if (existSubStr(board, occupied, chars, startIndex + 1, i, j + 1)) {
55+
return true;
56+
} else {
57+
occupied[i][j + 1] = 0;
58+
}
59+
}
60+
61+
if (j - 1 >= 0 && board[i][j - 1] == aChar && occupied[i][j - 1] == 0) {
62+
occupied[i][j - 1] = 1;
63+
if (existSubStr(board, occupied, chars, startIndex + 1, i, j - 1)) {
64+
return true;
65+
} else {
66+
occupied[i][j - 1] = 0;
67+
}
68+
}
69+
return false;
70+
}
71+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
### [79\. Word Search](https://leetcode.com/problems/word-search/)
2+
3+
Difficulty: **Medium**
4+
5+
6+
Given a 2D board and a word, find if the word exists in the grid.
7+
8+
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
9+
10+
**Example:**
11+
12+
```
13+
board =
14+
[
15+
['A','B','C','E'],
16+
['S','F','C','S'],
17+
['A','D','E','E']
18+
]
19+
20+
Given word = "ABCCED", return true.
21+
Given word = "SEE", return true.
22+
Given word = "ABCB", return false.
23+
```
24+
25+
26+
#### Solution
27+
28+
Language: **Java**
29+
30+
```java
31+
class Solution {
32+
public boolean exist(char[][] board, String word) {
33+
if (board == null || board.length == 0) {
34+
return false;
35+
}
36+
int rows = board.length;
37+
int width = board[0].length;
38+
int[][] occupied = new int[rows][width];
39+
char[] chars = word.toCharArray();
40+
char firstChar = chars[0];
41+
for (int i = 0; i < rows; i++) {
42+
for (int j = 0; j < width; j++) {
43+
if (board[i][j] == firstChar) {
44+
occupied[i][j] = 1;
45+
if (existSubStr(board, occupied, chars, 1, i, j)) {
46+
return true;
47+
} else {
48+
occupied[i][j] = 0;
49+
}
50+
}
51+
}
52+
}
53+
return false;
54+
}
55+
56+
private boolean existSubStr(char[][] board, int[][] occupied, char[] chars, int startIndex, int i, int j) {
57+
if (startIndex >= chars.length) {
58+
return true;
59+
}
60+
char aChar = chars[startIndex];
61+
if (i + 1 < board.length && board[i + 1][j] == aChar && occupied[i + 1][j] == 0) {
62+
occupied[i + 1][j] = 1;
63+
if (existSubStr(board, occupied, chars, startIndex + 1, i + 1, j)) {
64+
return true;
65+
} else {
66+
occupied[i + 1][j] = 0;
67+
}
68+
}
69+
70+
if (i - 1 >= 0 && board[i - 1][j] == aChar && occupied[i - 1][j] == 0) {
71+
occupied[i - 1][j] = 1;
72+
if (existSubStr(board, occupied, chars, startIndex + 1, i - 1, j)) {
73+
return true;
74+
} else {
75+
occupied[i - 1][j] = 0;
76+
}
77+
}
78+
79+
80+
if (j + 1 < board[0].length && board[i][j + 1] == aChar && occupied[i][j + 1] == 0) {
81+
occupied[i][j + 1] = 1;
82+
if (existSubStr(board, occupied, chars, startIndex + 1, i, j + 1)) {
83+
return true;
84+
} else {
85+
occupied[i][j + 1] = 0;
86+
}
87+
}
88+
89+
if (j - 1 >= 0 && board[i][j - 1] == aChar && occupied[i][j - 1] == 0) {
90+
occupied[i][j - 1] = 1;
91+
if (existSubStr(board, occupied, chars, startIndex + 1, i, j - 1)) {
92+
return true;
93+
} else {
94+
occupied[i][j - 1] = 0;
95+
}
96+
}
97+
return false;
98+
}
99+
}
100+
```
101+
![pic](https://raw.githubusercontent.com/PicGoBed/PicBed/master/2019-07-26-jlr6zb.jpg)

0 commit comments

Comments
 (0)