LeetCode-Python-79. 单词搜索

654 篇文章 23 订阅

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

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

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

思路:

DFS搜索 + 回溯。

注意由于测试数据很大,使用python语言一定要善用剪枝节省时间。

比如下面这一行如果不加最后的判断条件,就会超时…………

if 0<= x < m and 0<= y < n and visited[x][y] == 0  and not self.res: #not self.res很关键,剪枝非常重要
class Solution(object):
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        if not board or not board[0] or not len(word):
            return False
        
        m, n = len(board), len(board[0])
        if len(word) > m *n:
            return False
        
        self.res = False
        dx = [1, -1, 0, 0]
        dy = [0, 0, 1, -1]
        visited = [[0 for _ in range(n + 1)] for j in range(m + 1)]
        
        def dfs(start, x0, y0):
            if start >= len(word) or board[x0][y0] != word[start]: #找不到解
                return
            
            visited[x0][y0] = 1
            if board[x0][y0] == word[start]:
                if start == len(word) - 1: #找到一个可行解啦!!!
                    self.res = True
                    return
                else:
                    for k in range(4):
                        x = x0 + dx[k]
                        y = y0 + dy[k]
                        
                        if 0<= x < m and 0<= y < n and visited[x][y] == 0  and not self.res: #not self.res很关键,剪枝非常重要
                            dfs(start + 1, x, y) #找下一个字母
            visited[x0][y0] = 0 #回溯
                            
            
        for i in range(m):
            for j in range(n):
                if board[i][j] == word[0]:
                    dfs(0, i, j) #开始搜索
                if self.res:
                    return self.res
        return self.res
        
        
        
        

下面写于2019.6.18 

class Solution(object):
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        if not board or not board[0]:
            return False
        if not word:
            return True
        
        self.res = False
        dx = [1, -1, 0, 0]
        dy = [0, 0, 1, -1]
        def dfs(start, x0, y0):
            if start == len(word) - 1:
                self.res = True
                return
            visited.add((x0, y0))
            
            for k in range(4):
                x = x0 + dx[k]
                y = y0 + dy[k]
                # print x, y
                if 0 <= x < m and 0 <= y < n and (x, y) not in visited and board[x][y] == word[start + 1] and not self.res:
                    visited.add((x, y))
                    dfs(start + 1, x, y)
                    visited.remove((x, y))
            
        m, n = len(board), len(board[0])
        # print m * n, len(word)
        for i in range(m):
            for j in range(n):
                if board[i][j] == word[0]:
                    visited = set()
                    dfs(0, i, j)
                    if self.res:
                        return True
        return False

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值