本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
题目链接:LeetCode 79. 单词搜索
难度:中等
一、题目描述
原链接有图,推荐去原链接看。
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true
示例 3:
输入: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 仅由大小写英文字母组成
二、思路分析
找到与单词第一个字母匹配的位置,然后从这个位置开始,用DFS来搜索四周,看最后是否能匹配该单词。
如何表达『搜索四周』?
思路1:直接写。对于上下左右,分别先判断是否越界、是否已访问、单词当前字母与该位置的字母是否相同,类似的代码写(复制)4份。
思路2:上下左右的坐标相当于当前位置偏差分别是[0,1],[0,-1],[1,0],[-1,0],可以作为一个数组,再遍历这个数组。在每轮遍历中,当前位置加上偏差得到新的位置,再进行判断,这样逻辑写一次就可以了。
三、AC 代码
Python
def exist(self, board: List[List[str]], word: str) -> bool:
if len(word) == 0:
return True
rows = len(board)
if rows == 0:
return False
cols = len(board[0])
visited = set()
def searchFromPos(pos,word):
if board[pos[0]][pos[1]] != word[0]:
return False
if len(word) == 1:
return True
visited.add(pos)
nextMoves = ( (0,1),(1,0),(-1,0),(0,-1) )
for move in nextMoves:
cur = (pos[0]+move[0], pos[1]+move[1])
if cur in visited:
continue
if cur[0] >= 0 and cur[0] < rows and cur[1] >= 0 and cur[1] < cols:
if searchFromPos(cur,word[1:]):
return True
visited.remove(pos)
return False
for i in range(rows):
for j in range(cols):
if board[i][j] == word[0]:
if searchFromPos((i,j),word):
return True
return False
四、总结
常常遇到需要访问四周或者往四周的其中一个方向行走,且对于每一个方向处理思路都相同的情况,其实都可以把四周的偏差存入数组,再进行遍历。这样写可以少很多冗余的代码。 类似的需要访问四周的情景还有很多,比如下棋、表格行走等。
如果你觉的还不错的话,给我点个赞吧💐