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为单词长度,也是递归深度,需要栈存储数据)

相关推荐
武子康2 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
lisw058 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
一起学安全技术9 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer
Delightrs10 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
自信1504130575910 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
GoAI1 天前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi1 天前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M1 天前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen1 天前
罗克韦尔ACD工程归档离线变量树解析
算法·c#