zoukankan      html  css  js  c++  java
  • Leetcode练习(Python):数组类:第79题:给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

    题目:

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

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

    思路:

    深度优先和回溯法结合

    程序1:

    class Solution(object):
        
        directs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
        
        def exist(self, board: List[List[str]], word: str) -> bool:
            row = len(board)
            if row == 0:
                return False
            column = len(board[0])
            visited = [[0 for _ in range(column)] for _ in range(row)]          
            for index1 in range(len(board)):
                for index2 in range(len(board[0])):
                    if board[index1][index2] == word[0]:
                        visited[index1][index2] = 1
                        if self.backtrack(index1, index2, visited, board, word[1:]) == True:
                            return True
                        else:
                            visited[index1][index2] = 0
            return False     
        def backtrack(self, i, j, visited, board, word):
            if len(word) == 0:
                return True
            for direct in self.directs:
                cur_i = i + direct[0]
                cur_j = j + direct[1]
                if cur_i >= 0 and cur_i < len(board) and cur_j >= 0 and cur_j < len(board[0]) and board[cur_i][cur_j] == word[0]:
                    if visited[cur_i][cur_j] == 1:
                        continue
                    visited[cur_i][cur_j] = 1
                    if self.backtrack(cur_i, cur_j, visited, board, word[1:]) == True:
                        return True
                    else:
                        visited[cur_i][cur_j] = 0
            return False
    程序2:代码更简洁
    class Solution:
        def exist(self, board: List[List[str]], word: str) -> bool:
            for index1 in range(len(board)):
                for index2 in range(len(board[0])):
                    if self.dfs(board, index1, index2, word)  == True:
                        return True
            return False
        
        
        def dfs(self, board, i, j, word):
            if len(word) == 0:  
                return True
            if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]) or board[i][j] != word[0]:
                return False
            tmp = board[i][j]
            board[i][j] = '0'
            if self.dfs(board, i + 1, j, word[1:]) or self.dfs(board, i - 1, j, word[1:]) 
        or self.dfs(board, i, j + 1, word[1:]) or self.dfs(board, i, j - 1, word[1:]) == True:
                return True
            board[i][j] = tmp
            return False
  • 相关阅读:
    【DOM】如何给div的placeholder传参
    【nvm】使用nvm将node升级到指定版本
    【Worktile】升级业务组件库后,http的数据返回整个response而不是data问题及解决方案
    js获取上传文件内容
    【正则】正则表达式-零宽断言(?=,?<=,?!,?<!)及常见报错
    【Angular】动态组件
    【扩展】div获取焦点或可编辑
    【CSS】position新增属性sticky
    thinkphp写接口返回固定的形式方法
    thinkphp5计算文件大小
  • 原文地址:https://www.cnblogs.com/zhuozige/p/12760878.html
Copyright © 2011-2022 走看看