今日算法12-矩阵中的路径

一、题目描述

题目链接:leetcode.cn/problems/ju...

难易程度:中等

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。

示例:

arduino 复制代码
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

二、解题思路

深度优先搜索(DFS)+ 剪枝

深度优先搜索: 可以理解为暴力法遍历矩阵中所有字符串可能性。DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推。

剪枝: 在搜索中,遇到 这条路不可能和目标字符串匹配成功 的情况,则应立即返回,称之为 可行性剪枝 。

本题的输入是数组而不是矩阵(二维数组),因此需要先将数组转换成矩阵。

复杂度分析

时间复杂度 O(3K MN) : 最差情况下,需要遍历矩阵中长度为 K 字符串的所有方案,时间复杂度为 O(3K);矩阵中共有 MN 个起点,时间复杂度为 O(MN) 。

空间复杂度 O(K) : 搜索过程中的递归深度不超过 K ,因此系统因函数调用累计使用的栈空间占用 O(K) (因为函数返回后,系统调用的栈空间会释放)。最坏情况下 K=MN ,递归深度为 MN ,此时系统栈使用 O(MN) 的额外空间。

三、代码实现

ini 复制代码
class Solution {
    public boolean exist(char[][] board, String word) {
        char[] words = word.toCharArray();
        for(int h = 0; h < board.length; h++) {
            for(int l = 0; l < board[0].length; l++) {
                if (dfs(board, words, h, l, 0)) return true;
            }
        }
        return false;
    }
    boolean dfs(char[][] board, char[] words, int h, int l, int wordIndex) {
        if (h >= board.length || h < 0 
            || l >= board[0].length || l < 0 
            || board[h][l] != words[wordIndex]) {
            return false;
        }
        if (wordIndex == words.length - 1) return true;
        board[h][l] = '\0';
        boolean res = dfs(board, words, h + 1, l, wordIndex + 1) 
            || dfs(board, words, h - 1, l, wordIndex + 1) 
            || dfs(board, words, h, l + 1, wordIndex + 1) 
            || dfs(board, words, h , l - 1, wordIndex + 1);
        board[h][l] = words[wordIndex];
        return res;
    }
}

推荐阅读

封面

今日算法系列,题解更新地址:studeyang.tech/2023/0802.h...

相关推荐
Magic--6 分钟前
【LeetCode 27. 移除元素】C++ 范围 for 极简实现与原理解析
c++·算法·leetcode
A923A9 分钟前
【洛谷刷题 | 第九天】
算法·二分·洛谷
旖-旎11 分钟前
位运算(只出现一次的数字|||)(5)
c++·算法·leetcode·位运算
AIpanda88814 分钟前
数字员工是什么?熊猫智汇在提高销售转化率中的作用有哪些?
算法
源码之家16 分钟前
计算机毕业设计:基于Python的美食数据采集可视化系统 Django框架 Scrapy爬虫 可视化 数据分析 大数据 机器学习 食物 食品(建议收藏)✅
python·算法·机器学习·信息可视化·课程设计
简简单单做算法17 分钟前
基于Q-Learning强化学习的小车倒立摆平衡控制系统matlab性能仿真
算法·matlab·强化学习·qlearning·小车倒立摆平衡控制
Book思议-18 分钟前
【数据结构】循环与递归:C 语言实现求和与斐波那契数列的两种思路
数据结构·算法·循环与递归
Mr_Xuhhh20 分钟前
LeetCode 热题 100 刷题笔记:从数组到字符串的经典解法(续)
java·数据结构·算法
VelinX25 分钟前
【个人学习||算法】贪心算法
学习·算法·贪心算法
源码之家28 分钟前
计算机毕业设计:Python智慧交通大数据监控系统 Flask框架 可视化 百度地图 汽车 车况 数据分析 大模型 机器学习(建议收藏)✅
大数据·python·算法·机器学习·信息可视化·flask·课程设计