【hot100】刷题记录(27)-单词搜索

题目描述:

给定一个 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 仅由大小写英文字母组成

 

我的作答:

类似于岛屿问题+回溯,难点在于什么时候return和return什么;

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        m = len(board)
        n = len(board[0])
        def backtracking(x, y, path, index, visited):
            if index==len(word):
                if ''.join(path)==word: return True #刚好搜索到return T
                else: return False #搜索完但是不正确return F
            direction = [[1,0], [-1,0], [0,1], [0,-1]]
            for i, j in direction:
                next_x = x+i
                next_y = y+j
                if next_x<0 or next_y<0 or next_x>m-1 or next_y>n-1:
                    continue
                if index<len(word) and board[next_x][next_y]==word[index] and not visited[next_x][next_y]:
                    path.append(board[next_x][next_y])
                    visited[next_x][next_y] = 1
                    if backtracking(next_x, next_y, path, index+1, visited):
                        return True #层层返回True,期间只要有一层不对就不会返回TRUE
                    visited[next_x][next_y] = 0
                    path.pop()
            return False #只要不返回t就会返回f(此时四个方向都搜过了)
        visited = [[0]*n for _ in range(m)]
        for i in range(m):
            for j in range(n):
                if not visited[i][j] and board[i][j]==word[0]:
                    visited[i][j] = 1
                    if len(word)>1:
                        result = backtracking(i, j, [word[0]], 1, visited)
                    if len(word)==1 or result: return True #如果长度大于1且返回True
                    else:
                        visited[i][j] = 0 #重设为0
        return False

 

参考:

牛!

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        def dfs(i, j, k):
            if not 0 <= i < len(board) or not 0 <= j < len(board[0]) or board[i][j] != word[k]: return False
            if k == len(word) - 1: return True
            board[i][j] = '' #随便改成什么避免下一层被搜到(避免重复)
            res = dfs(i + 1, j, k + 1) or dfs(i - 1, j, k + 1) or dfs(i, j + 1, k + 1) or dfs(i, j - 1, k + 1)
            board[i][j] = word[k] #复原
            return res

        for i in range(len(board)):
            for j in range(len(board[0])):
                if dfs(i, j, 0): return True
        return False

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值