【LeetCode热题100】打卡第24天:单词搜索

news2024/9/25 17:21:06

文章目录

  • 单词搜索
    • ⛅前言
    • 🔒题目
    • 🔑题解

单词搜索

⛅前言

大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏!

精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。在此专栏中,我们将会涵盖各种类型的算法题目,包括但不限于数组、链表、树、字典树、图、排序、搜索、动态规划等等,并会提供详细的解题思路以及Java代码实现。如果你也想刷题,不断提升自己,就请加入我们吧!QQ群号:827302436。我们共同监督打卡,一起学习,一起进步。

博客主页💖:知识汲取者的博客

LeetCode热题100专栏🚀:LeetCode热题100

Gitee地址📁:知识汲取者 (aghp) - Gitee.com

Github地址📁:Chinafrfq · GitHub

题目来源📢:LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

PS:作者水平有限,如有错误或描述不当的地方,恳请及时告诉作者,作者将不胜感激

🔒题目

原题链接:79.单词搜索

image-20230617205049286

🔑题解

  • 解法一:BFS+剪枝

    /**
     * @author ghp
     * @date 2023/6/17
     * @title
     * @description
     */
    class Solution {
        private boolean f = false;
        private boolean[][] vis;
        private int[][] dir = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    
        public boolean exist(char[][] board, String word) {
            int m = board.length;
            int n = board[0].length;
            if (m == 1 && n == 1) {
                // 单独处理board只有一个元素的情况
                return word.equals("" + board[0][0]);
            }
            vis = new boolean[m][n]; // 用于判断当前节点是否已遍历
            // 从每一个节点出发,进行深搜
            for (int i = 0; i < board.length; i++) {
                if (f){
                    // 一但f边为true,就直接停止搜索,节省时间
                    break;
                }
                for (int j = 0; j < board[0].length; j++) {
                    dfs(board, word, new StringBuilder(), i, j);
                }
            }
            return f;
        }
    
        private void dfs(char[][] board, String word, StringBuilder path, int r, int c) {
            if (f){
                // 已经从board中找到了word,没必要再搜索了
            }
            if (r >= board.length || r < 0 || c == board[0].length || c < 0) {
                // 越界
                return;
            }
            if (!word.substring(0, path.length()).equals(path.toString())) {
                // 剪枝(当前路径已经出现一个不符合word的单词了,结束本次搜索)
                return;
            }
            if (path.length() == word.length()) {
                // 已经在board中找到了word,结束循环
                f = true;
                return;
            }
            for (int i = 0; i < 4; i++) {
                if (!vis[r][c]) {
                    // 当前节点没有被遍历过,搜索下一个节点,并将当前节点标记为true
                    path.append(board[r][c]);
                    vis[r][c] = true;
                    bfs(board, word, path, r + dir[i][0], c + dir[i][1]);
                    // 恢复现场,用于回溯
                    path.deleteCharAt(path.length() - 1);
                    vis[r][c] = false;
                }
            }
        }
    }
    

    复杂度分析:

    • 时间复杂度: n ∗ m ∗ 3 L n*m*3^L nm3L
    • 空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

    其中m和n分别是board数组的行数和列数,L是word字符串的长度

    代码优化

    /**
     * @author ghp
     * @date 2023/6/17
     * @title
     * @description
     */
    class Solution {
    
        public boolean exist(char[][] board, String word) {
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[0].length; j++) {
                    if (dfs(board, word, 0, i, j)) {
                        return true;
                    }
                }
            }
            return false;
        }
    
        private boolean dfs(char[][] board, String word, int index, int r, int c) {
            if (r > board.length - 1 || r < 0 || c > board[0].length - 1 || c < 0 // 越界,结束递归
                    || board[r][c] == '.' // 当前节点已遍历,结束递归
                    || board[r][c] != word.charAt(index)) { // 当前路径已经出现一个不符合的单词了,结束递归
                return false;
            }
            if (index == word.length() - 1) {
                // index的长度等于word(因为从0开始计数,所以word长度要-1),说明已经再board中找到了word
                return true;
            } else {
                // 当前节点没有遍历,则置为.表示已遍历,然后遍历四个方向
                char temp = board[r][c];
                board[r][c] = '.';
                boolean f = dfs(board, word, index + 1, r + 1, c) || dfs(board, word, index + 1, r - 1, c)
                        || dfs(board, word, index + 1, r, c + 1) || dfs(board, word, index + 1, r, c - 1);
                // 恢复现场,用于回溯
                board[r][c] = temp;
                return f;
            }
        }
    
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/657516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用花生壳进行内网穿透实验SQLServer

使用的是体验版&#xff0c;进行实验足够了 &#xff08;1&#xff09;输入花生壳帐号密码登录花生壳管理平台&#xff0c;在【内网穿透】界面点击添加映射&#xff1b; &#xff08;2&#xff09;接着需要填写映射ERP服务器的相关内容&#xff1a;①应用类型&#xff1a;ERP系…

【论文系列解读】StableDiff总结

1. diffusion (0) 总结 可以参考此处&#xff1a;https://blog.csdn.net/weixin_40920183/article/details/130652651 https://zhuanlan.zhihu.com/p/599887666 总的来说&#xff0c;diffusion就是分为训练和采样两个阶段。 &#xff08;A&#xff09;训练阶段&#xff1a…

spring boot security快速使用示例

创建spring boot项目 生成脚手架 登录 https://start.spring.io/ 快速创建一个spring boot脚手架的demo&#xff1a; 配置依赖 因为本地依赖的原因&#xff0c;所以更换了spring boot版本为&#xff1a;2.6.11 <parent><groupId>org.springframework.boot<…

GC垃圾回收

GC垃圾回收 了解什么是垃圾回收掌握垃圾会回收的常见算法学习串行、并行、并发、G1垃圾收集器学习GC日志的可视化查看 1.什么是垃圾回收&#xff1f; 程序的运行必然需要申请内存资源&#xff0c;无效的对象资源如果不及时处理就会一直占有内存资源&#xff0c;最终将导致内…

设计模式(二十一):行为型之访问者模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

Debian openssh-server 的安装

在之前安装系统的时候有一个安装 SSH 服务的&#xff0c;结果没点上&#xff0c;导致系统完成后&#xff0c;ssh无法连接上啊&#xff0c;于是要安装sshd 服务。使用命令&#xff1a;apt-get install openssh-server 结果就出现问题了&#xff1a; 网上搜索说是要更新源&#x…

004 maven 插件默认的

Maven – Guide to Configuring Plug-inshttps://maven.apache.org/guides/mini/guide-configuring-plugins.html 默认插件 参数 Apache Maven Compiler Plugin – compiler:compilehttps://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#forceJavacCom…

MATLAB读取OpenFOAM的二进制文件

OpenFOAM的文件格式 上面是OpenFOAM二进制文件的格式&#xff0c;我们可以看出&#xff0c;前面21行都是无关的说明文件&#xff0c;22开始时除了一个括号之外&#xff0c;其它的都是数据。 读取数据 读取数据的思路非常简单&#xff0c;忽略不需要的&#xff0c;读取需要的。…

第七十七天学习记录:高等数学:定积分应用(宋浩板书)

定积分是微积分的一种应用&#xff0c;通过定积分可以求出曲线下面的面积、弧长、质心、转动惯量等一系列物理量。以下是定积分的一些常见应用&#xff1a; 曲线下面的面积&#xff1a;定积分可以用于求曲线下面的面积。举个例子&#xff0c;如果想要求函数f(x) x^2在区间[0,1…

VFC芯片结构及其工作原理

&#xff08;二&#xff09; VFC芯片结构及其工作原理 1&#xff0e;VFC芯片 AD654的结构 AD654芯片是一个单片VFC变换芯片&#xff0c;中心频率为250kHZ。它是由阻抗变换器A、压控振荡器和一个驱动输出级回路构成&#xff0c;其内部结构见图1&#xff0d;15&#xff08;a入压…

VFC式数据采集系统

三、VFC式数据采集系统 &#xff08;一&#xff09;VFC型的A&#xff0f;D变换概述 一般来说在 A&#xff0f;D的变换过程中&#xff0c; CPU要使 S&#xff0f;H、 MPX、 A&#xff0f;D三个芯片之间控制协调好&#xff0c;因此接口电路复杂。而且ADC芯片结构较复杂&#xff0…

车载软件架构 —— 闲聊几句AUTOSAR OS(五)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标准。到最…

Nature揭示--迷幻药物如何实现其强大的健康益处

迷幻药物MDMA&#xff08;也称为摇头丸&#xff09;的结晶&#xff0c;可以恢复小鼠从环境中学习特定方面的能力。图片来源&#xff1a; Police Scotland/Contraband Collection/Alamy 迷幻药物是一类能够引起意识状态改变的药物&#xff0c;被广泛应用于精神和医疗领域。尽管迷…

【简单便捷】解决Ubuntu内存不足问题:Ubuntu16.0.4 进行内存扩容

文章目录 电脑环境前言一、总述二、先在标题&#xff1a;虚拟机-->设置上进行扩容三、扩容之后 打开终端 执行 sudo apt install gparted四、执行 sudo gparted五、扩容成功六、重启测试 可以看到大概率成功了。 电脑环境 Windows 11 专业版系统 前言 在开发初期&#xf…

232 · 短网址

链接&#xff1a;LintCode 炼码 题解&#xff1a; class TinyUrl { public:/** param url: a long url* return: a short url starts with http://tiny.url/*/string longToShort(string &url) {// write your code herestd::string shorturl generate_shorturl(url);whi…

为CentOs配置静态IP

目录 第一步&#xff1a;查看物理机IP 第二步&#xff1a;虚拟机网络设置 点击虚拟机->编辑虚拟机设置 第三步&#xff1a;CentOS网络配置文件 第四步&#xff1a;重启网络 第五步&#xff1a;测试网络 为什么要设置静态IP 在安装好CentOS虚拟机以后&#xff0c;一般我…

代码随想录算法训练营第三十九天| 62.不同路径 、63. 不同路径 II

不同路径 题目链接&#xff1a;力扣 题外话&#xff1a;这题拿到的时候就发现其实是小学三年级的奥数题&#xff0c;甚至寒假看我妹做过【笑哭&#x1f602;】 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] &#xff1a;表示从&#xff08;0,0&…

nvm控制nodejs版本

1.关系如图 2. 环境配置 3.报错解决 路径导致的nvm安装nodejs失败&#xff1f; The system cannot find the path specified. Could not download node.js v16.19.1 64-bit executable. 解决&#xff1a;nvm安装路径D:\Program Files\nvm&#xff0c;nvm管理的nodejs路径D:\Pro…

在Qgis中使用QMetaTiles插件进行XYZ瓦片离线下载方法

目录 前言 一、Qgis插件库 1、插件库简介 2、QMetaTiles介绍 二、QMetaTiles插件安装 1、在线安装 2、离线安装 三、瓦片下载 1、打开QmeaTiles插件 2、Leaflet加载下载的瓦片 总结 前言 电子地图是地图类应用的基石&#xff0c;作为整个系统的基础。其它的图层要素都构…

Web应用技术(第八周/第4次练习/4h)

这一次练习对JSP和Servlet进行了补充学习 1.JSP的本质&#xff1a;2.include指令的作用&#xff1a;3.EL表达式语言与JSTL&#xff1a;关于EL表达式&#xff1a;&#xff08;1&#xff09;EL表达式用于取参数值与参数值的设定&#xff1a;&#xff08;2&#xff09;EL表达式的本…