Python描述 LeetCode 79. 单词搜索

  大家好,我是亓官劼(qí guān jié ),在【亓官劼】公众号GitHub、B站等平台分享一些技术博文,主要包括前端开发、python后端开发、小程序开发、数据结构与算法、docker、Linux常用运维、NLP等相关技术博文,时光荏苒,未来可期,加油~

  如果喜欢博主的文章可以关注博主的个人公众号【亓官劼】(qí guān jié),里面的文章更全更新更快。如果有需要找博主的话可以在公众号后台留言,我会尽快回复消息.

Python描述 LeetCode 79. 单词搜索_公众号

本文原创为【亓官劼】(qí guān jié ),请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 全部文章请关注微信公众号【亓官劼】。

题目

给定一个 ​​m x n​​​ 二维字符网格 ​​board​​​ 和一个字符串单词 ​​word​​​ 。如果 ​​word​​​ 存在于网格中,返回 ​​true​​​ ;否则,返回 ​​false​​ 。

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

示例 1:

Python描述 LeetCode 79. 单词搜索_公众号_02

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

Python描述 LeetCode 79. 单词搜索_算法_03

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true

示例 3:

Python描述 LeetCode 79. 单词搜索_leetcode_04

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false

提示:

  • ​m == board.length​
  • ​n = board[i].length​
  • ​1 <= m, n <= 6​
  • ​1 <= word.length <= 15​
  • ​board​​​ 和 ​​word​​ 仅由大小写英文字母组成

**进阶:**你可以使用搜索剪枝的技术来优化解决方案,使其在 ​​board​​ 更大的情况下可以更快解决问题?

Python描述

爆搜,这里每个单词只能用一次,加一个访问数组控制

class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
res = False
n,m,lw = len(board),len(board[0]),len(word)
dr = [[-1,0],[0,1],[1,0],[0,-1]]
v = [[0 for _ in range(m)] for __ in range(n)]
def dfs(dx,dy,pos):
nonlocal res,lw,word
if pos == lw:
res = True
return
for d in range(4):
nx,ny = dx+dr[d][0], dy+dr[d][1]
if 0 <= nx < n and 0 <= ny < m and v[nx][ny] == 0 and board[nx][ny] == word[pos]:
v[nx][ny] = 1
dfs(nx,ny,pos+1)
v[nx][ny] = 0

for i in range(n):
for j in range(m):
if board[i][j] == word[0]:
v[i][j] = 1
dfs(i,j,1)
if res:
return res
v[i][j] = 0
return False