思路
DFS,由于有比较变态的测试用例,所以要特别注意剪枝,一旦搜到结果之后,在返回的时候尽快往递归和循环外面跳。注意代码里注释的地方,都是能加速的地方。
代码
class Solution:
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
self.flag = False
def char_exist(board, i, j, word, n):
if n == len(word) or self.flag: # 加速递归回退
self.flag = True
return
if i in range(len(board)) and j in range(len(board[0])) and board[i][j] == word[n]:
candidate = [(i - 1, j), (i, j - 1), (i + 1, j), (i, j + 1)]
board[i][j] = '#'
for (a, b) in candidate:
char_exist(board, a, b, word, n + 1)
if self.flag == True: # 加速递归回退
return
board[i][j] = word[n]
for i in range(len(board)):
for j in range(len(board[0])):
char_exist(board, i, j, word, 0)
if self.flag == True: # 加速跳出循环
return True
return False