LeetCode 79. 单词搜索 |刷题打卡

283 阅读2分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

题目链接: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

四、总结

常常遇到需要访问四周或者往四周的其中一个方向行走,且对于每一个方向处理思路都相同的情况,其实都可以把四周的偏差存入数组,再进行遍历。这样写可以少很多冗余的代码。 类似的需要访问四周的情景还有很多,比如下棋、表格行走等。

如果你觉的还不错的话,给我点个赞吧💐