IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> LeetCode - 解题笔记 - 79 - Word Search -> 正文阅读

[Python知识库]LeetCode - 解题笔记 - 79 - Word Search

Solution 1

一开始我以为这道题是BFS,但是在套模板的时候发现了一个变化:遍历过程中需要根据考察的具体字符重新判定是否遍历过(某个位置在考察第三个字符时遍历过,那么在考察第七个字符时还是可以遍历的),因此还是写成DFS的形式了。

  • 时间复杂度: O ( M N × 3 L ) O(MN \times 3^L) O(MN×3L),其中 M M M N N N时输入地图的高度和宽度, L L L为字符串长度,搜索树的分支数最多为3(因为四个方向,最坏走3次)
  • 空间复杂度: O ( M N ) O(MN) O(MN),每个遍历位置的状态保存
class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        vector<vector<bool>> visited(board.size(), vector<bool>(board[0].size()));
        for (int i = 0; i < board.size(); ++i) {
            for (int j = 0; j < board[0].size(); ++j) {
                if (board[i][j] == word.at(0) && this->dfs(board, visited, i, j, word, 0)) {
                    return true;
                }
            }
        }
        
        return false;
    }
    
private:
    vector<pair<int, int>> dirs{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    
    bool dfs(vector<vector<char>> & board, vector<vector<bool>> & visited, int i, int j, string & word, int pos) {
        bool result = false;
        if (board[i][j] != word.at(pos)) { return false; }
        if (pos == word.size() - 1) { return true; }
        
        visited[i][j] = true;
        
        for (auto & dir: dirs) {
            int iNext = i + dir.first, jNext = j + dir.second;
            if (
                iNext >= 0 && iNext < board.size() &&
                jNext >= 0 && jNext < board[0].size() && 
                !visited[iNext][jNext]
               ) {
                if (this->dfs(board, visited, iNext, jNext, word, pos + 1)) { result = true; break; }
            }
        }
        
        visited[i][j] = false;
        
        return result;
    }
};

Solution 2

Solution 1的Python实现,不知道为啥我的实现特别慢

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]
        visited = [[False] * len(board[0]) for i in range(len(board))]
        
        def dfs(i: int, j: int, pos: int) -> bool:
            result = False
            if board[i][j] != word[pos]: return False
            if pos == len(word) - 1: return True
            
            visited[i][j] = True
            # print(i, j, board[i][j], pos, word[pos])
            for ioffset, joffset in dirs:
                iNext, jNext = i + ioffset, j + joffset
                if 0 <= iNext < len(board) and 0 <= jNext < len(board[0]) and not visited[iNext][jNext]:
                    # print("\t", iNext, jNext, board[iNext][jNext], pos + 1, word[pos + 1])
                    if dfs(iNext, jNext, pos + 1):
                        result = True
                        break
            
            visited[i][j] = False
            return result
        
        for i in range(len(board)):
            for j in range(len(board[0])):
                if  board[i][j] == word[0] and dfs(i, j, 0):
                    return True
        
        return False
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 11:36:25  更:2021-07-25 11:37:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/25 14:19:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计