-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path79.word-search.go
91 lines (80 loc) · 1.94 KB
/
79.word-search.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
* @lc app=leetcode id=79 lang=golang
*
* [79] Word Search
*
* https://leetcode.com/problems/word-search/description/
*
* algorithms
* Medium (35.70%)
* Likes: 4250
* Dislikes: 199
* Total Accepted: 522.2K
* Total Submissions: 1.5M
* Testcase Example: '[["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]]\n"ABCCED"'
*
* Given a 2D board and a word, find if the word exists in the grid.
*
* 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.
*
* Example:
*
*
* board =
* [
* ['A','B','C','E'],
* ['S','F','C','S'],
* ['A','D','E','E']
* ]
*
* Given word = "ABCCED", return true.
* Given word = "SEE", return true.
* Given word = "ABCB", return false.
*
*
*
* Constraints:
*
*
* board and word consists only of lowercase and uppercase English letters.
* 1 <= board.length <= 200
* 1 <= board[i].length <= 200
* 1 <= word.length <= 10^3
*
*
*/
// @lc code=start
func exist(board [][]byte, word string) bool {
return exist1(board, word)
}
func exist1(board [][]byte, word string) bool {
if len(board) == 0 || len(board[0]) == 0 {
return false
}
for i := 0; i < len(board); i++ {
for j := 0; j < len(board[i]); j++ {
if dfs(board, i, j, word, 0) {
return true
}
}
}
return false
}
func dfs(board [][]byte, row int, col int, word string, index int) bool {
if index == len(word) {
return true
}
if row < 0 || row >= len(board) || col < 0 || col >= len(board[row]) || word[index] != board[row][col] {
return false
}
tmp := board[row][col]
// mark visited flag
board[row][col] = '%'
flag := dfs(board, row+1, col, word, index+1) || dfs(board, row-1, col, word, index+1) || dfs(board, row, col+1, word, index+1) || dfs(board, row, col-1, word, index+1)
// reset visited flag
board[row][col] = tmp
return flag
}
// @lc code=end