79-单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

提示:

  • boardword 中只包含大写和小写英文字母。
  • 1 <= board.length <= 200
  • 1 <= board[i].length <= 200
  • 1 <= word.length <= 10^3

示例

board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]

给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false

解法

核心思想:使用回溯算法(dfs),寻找当前字母的上下左右是否存在符合条件的单词,找不到就返回上一层

class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
row = len(board)
col = len(board[0])

def __dfs(i, j, wd_len, visited):
if wd_len == len(word):
return True
for x, y in [(-1, 0), (1, 0), (0, 1), (0, -1)]:
tem_i = x + i
tem_j = y + j
if 0 <= tem_i < row and 0 <= tem_j < col \
and board[tem_i][tem_j] == word[wd_len] \
and (tem_i, tem_j) not in visited:
visited.add((tem_i, tem_j))
if __dfs(tem_i, tem_j, wd_len+1, visited):
return True
visited.remove((tem_i, tem_j))
return False

for i in range(row):
for j in range(col):
if board[i][j] == word[0] and __dfs(i, j, 1, {(i, j)}):
return True
return False

相关信息

LeetCode:Discussion | Solution

-------------本文结束感谢您的阅读-------------