LC 单词搜索
时间:2023.9.30
题目地址:单词搜索
题目介绍
题目分析
首先,确定回溯算法。一开始想到的是将所有可能的序列找出来然后在判断,是否有目标序列,这样就没有考虑剪枝,效率可能会很低,也可能会超时,所以接下来就直接介绍优化后的算法。
选定一个起点,然后上下左右四个方向进行搜索,用
i
n
d
e
x
index
index 来代表此时搜索的是第几个元素,并判断此时的搜到的元素是否和目标元素相同,不同则将这个方向给剪掉(还需注意越界问题)。
判断结果的条件便是
i
n
d
e
x
+
1
=
l
e
n
(
w
o
r
d
)
index+1=len(word)
index+1=len(word) ,当此时搜索元素为最后一个,说明此时找到了这个序列,返回
T
r
u
e
True
True 即可。
剩下的便是回溯了。
代码
def backtrack(board, i, j, index):
# 越界和剪枝判断
if i < 0 or i >= m or j < 0 or j >= n or board[i][j] != word[index]:
return False
# 判断是否满足输出结果
if index+1 == len(word):
return True
# 临时存储此时的值
temp = board[i][j]
# 记录走过了
board[i][j] = '.'
# 上下左右搜索,返回最后的结果
res = backtrack(board, i+1, j, index+1) or backtrack(board, i-1, j, index+1) or backtrack(board, i, j+1, index+1) or backtrack(board, i, j-1, index+1)
# 返回
board[i][j] = temp
return res
m = len(board)
n = len(board[0])
for i in range(m):
for j in range(n):
if backtrack(board, i, j, 0):
return True
return False