-
Notifications
You must be signed in to change notification settings - Fork 0
/
0079__word_search.py
115 lines (87 loc) · 2.91 KB
/
0079__word_search.py
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
"""
LeetCode: https://leetcode.com/problems/word-search/
Given an m x n grid of characters board and a string word, return true if word exists in the grid.
The word can be constructed from letters of sequentially adjacent cells, where adjacent cells are horizontally or
vertically neighboring. The same letter cell may not be used more than once.
## Example 1
Input:
board = [
[ "A", "B", "C", "E" ],
[ "S", "F", "C", "S" ],
[ "A", "D", "E", "E" ],
]
word = "ABCCED"
Output: true
## Example 2
Input:
board = [
[ "A", "B", "C", "E" ],
[ "S", "F", "C", "S" ],
[ "A", "D", "E", "E" ],
]
word = "SEE"
Output: true
## Example 3
Input:
board = [
[ "A", "B", "C", "E" ],
[ "S", "F", "C", "S" ],
[ "A", "D", "E", "E" ],
]
word = "ABCB"
Output: false
## Constraints
* m == board.length
* n = board[i].length
* 1 <= m, n <= 6
* 1 <= word.length <= 15
* board and word consists of only lowercase and uppercase English letters.
## Follow up
Could you use search pruning to make your solution faster with a larger board?
"""
from typing import List
from unittest import TestCase
class Solution(TestCase):
def test_example_1(self):
board = [["A", "B", "C", "E"], ["S", "F", "C", "S"], ["A", "D", "E", "E"], ]
word = "ABCCED"
self.assertTrue(self.exist(board, word))
def test_example_2(self):
board = [["A", "B", "C", "E"], ["S", "F", "C", "S"], ["A", "D", "E", "E"], ]
word = "SEE"
self.assertTrue(self.exist(board, word))
def test_example_3(self):
board = [["A", "B", "C", "E"], ["S", "F", "C", "S"], ["A", "D", "E", "E"], ]
word = "ABCB"
self.assertFalse(self.exist(board, word))
def test_case_70(self):
board = [["A", "B", "C", "E"], ["S", "F", "E", "S"], ["A", "D", "E", "E"]]
word = "ABCESEEEFS"
self.assertTrue(self.exist(board, word))
def exist(self, board: List[List[str]], word: str) -> bool:
if word == "":
return True
def dfs(r: int, c: int, ptr: 0) -> bool:
if (
ptr >= len(word)
or r < 0 or r >= len(board)
or c < 0 or c >= len(board[r])
or board[r][c] != word[ptr]
or (r, c) in visited
):
return False
visited.add((r, c))
if ptr == len(word) - 1:
return True
res = any(dfs(nr, nc, ptr + 1) for nr, nc in [(r + 1, c), (r - 1, c), (r, c + 1), (r, c - 1)])
if res:
return True
visited.remove((r, c))
return False
for row in range(len(board)):
for col in range(len(board[row])):
if board[row][col] == word[0]:
visited = set()
if dfs(row, col, 0):
return True
return False