[Leetcode]单词搜索
题目描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
提示:
board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
解题思路
实现代码
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
row = len(board)
if row == 0:
return False
col = len(board[0])
flag = [[0 for j in range(col)] for i in range(row)] #用于标记是否已经访问过
directions = [[0, 1], [0, -1], [-1, 0], [1, 0]] #从上下左右四个方向进行搜索
def helper(i, j, index, flag):
if index == len(word) - 1: #递归结束条件
return board[i][j] == word[index]
if board[i][j] == word[index]: #如果字母匹配继续搜索
flag[i][j] = 1 #先设为1,如果不行再设回0
for direction in directions: #判断每个方向,只要有可行的就返回True
newx, newy = i + direction[0], j + direction[1] #这个方向的新坐标
if 0 <= newx < row and 0 <= newy < col and flag[newx][newy] == 0: #新坐标在网格范围内
if helper(newx, newy, index + 1, flag) == True:
return True
flag[i][j] = 0 #四个方向都不可行,意味着这个单元格没走,flag设回0
return False #继续下一轮搜索
for i in range(row): #遍历每个单元格
for j in range(col):
if helper(i, j, 0, flag) == True: #每次搜素都从word的第0个位置开始
return True
return False