LeetCode 79. 单词搜索

题目描述

给定一个 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

解法

1.回溯法

解题思路

此题与LeetCode 200. 岛屿数量-CSDN博客问题有些类似,就是以每个点都作为起点深度优先遍历一遍,在遍历过程中要标记已读,并回溯,此问题只需要找到一个答案,于是找到答案立马返回。

cpp 复制代码
class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        const int DIRS[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
        int m = board.size(),n = board[0].size(),t = word.size();
        auto dfs = [&](this auto && dfs,int i,int j,int l){
            if(i < 0 || i >= m || j < 0 || j >= n || l > t || board[i][j] != word[l]) return false;
            if(l == t - 1) return true; //因为从0开始计数
            char temp = board[i][j];
            board[i][j] = '#';   //标记已读
            for(int x = 0;x < 4;x ++){
                if(dfs(i + DIRS[x][0],j + DIRS[x][1],l + 1)) return true;
            }
            board[i][j] = temp; //回溯
            return false;
        };
        
        for(int i = 0;i < m;i ++){
            for(int j = 0;j < n;j ++){
                if(dfs(i,j,0)) return true; //有一个起点满足条件,就要返回
            }
        }
        return false;
    }
};

时间复杂度O(M·N·4^L),空间复杂度O(L)(L为单词长度,也是递归深度,需要栈存储数据)

相关推荐
顺顺 尼6 小时前
linux 进程信号(上)
linux·c++·算法
罗西的思考6 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(5)--- GRPO
人工智能·算法·机器学习
richard_yuu6 小时前
动态规划:强化学习的「数学基础」,从 MDP 到值迭代
深度学习·神经网络·算法·yolo·机器学习·动态规划
mmmmath_36 小时前
LeetCode.225.用队列实现栈
算法
Elaine3366 小时前
数据结构与算法-程序
数据结构·python·算法·计算机基础·编程基础
2601_965742227 小时前
布局GEO AI本地营销,我重点看这几个细节
大数据·人工智能·算法·ai·新媒体运营
EatFan7 小时前
AI Agent 上生产前先加三道闸门:审批、限权、可回放的工程实践
人工智能·python·算法·多智能体·ai agent·mcp·harness
思茂信息7 小时前
CST软件BCI仿真模型及仿真案例
开发语言·单片机·嵌入式硬件·算法·emc
Persistent的粽子!7 小时前
双指针算法:最大盛水容器
c++·算法·leetcode
hold?fish:palm8 小时前
44 二叉搜索树中第K小的元素
开发语言·c++·算法