79. 单词搜索

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

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
思路:
记忆化搜索dfs或者bfs
内存可以用hash表优化 但是没有必要
注意边界条件
code:

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        n, m, l = len(board), len(board[0]), len(word)
        directs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
        visited = [[False] * m for _ in range(n)]
        ans = l*[' ']

        def dfs(x, y, dis):
            if dis == l:
                return True
            for dit in directs:
                xx, yy = x + dit[0], y + dit[1]
                if 0<= xx and xx < n and 0<= yy and yy < m and visited[xx][yy] == False \
                and board[xx][yy] == word[dis]:
                    ans[dis] = board[xx][yy]
                    visited[xx][yy] = True
                    if dfs(xx, yy, dis + 1) == True:
                        return True
                    visited[xx][yy] = False
            return False

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值