力扣hot100--DFS/BFS

DFS/BFS

1. 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

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • board 和 word 仅由大小写英文字母组成

// 定义一个Solution类,用于解决二维网格中查找单词的问题
class Solution {
public:
    // 定义四个方向的移动向量,分别对应上、右、下、左
    int dx[4]{1,0,-1,0};
    int dy[4]{0,-1,0,1};
    
    // 使用深度优先搜索(DFS)和回溯算法来查找单词
    bool dfs(vector<vector<char>>& board, string word, int k, int i, int j, vector<vector<int>> &visit) {
        // 如果当前字符不匹配,直接返回false
        if(word[k] != board[i][j]) {
            return false;
        } else if (k == word.size() - 1) {
            // 如果已经匹配到最后一个字符,返回true
            return true;
        }

        visit[i][j] = 1; // 标记当前位置为已访问
        bool result = false;
        // 遍历四个方向
        for (int d{}; d < 4; ++d) {
            // 计算新的位置
            int i1 = i + dx[d];
            int j1 = j + dy[d];

            // 检查新位置是否在网格内
            if (min(i1, j1) < 0 || i1 >= board.size() || j1 >= board[0].size()) {
                continue;
            }

            // 如果新位置已被访问过,跳过
            if (1 == visit[i1][j1]) continue;

            // 递归搜索新位置
            if (dfs(board, word, k + 1, i1, j1, visit)) {
                result = true;
                break;
            } 
        }
        
        visit[i][j] = 0; // 回溯,将当前位置标记为未访问
        return result;
    }

    // 主函数,用于判断网格中是否存在给定的单词
    bool exist(vector<vector<char>>& board, string word) {
        int m = board.size(), n = board[0].size();
        vector<vector<int>> visit(m, vector<int>(n)); // 初始化访问标记矩阵
        // 遍历网格的每个位置,以每个位置为起点进行DFS
        for (int i{}; i < m; ++i) {
            for (int j{}; j < n; ++j) {
                bool flag{false};
                flag = dfs(board, word, 0, i, j, visit);
                if (flag) return true;
            }
        }
        return false;
    }
};

解释:

这段代码首先定义了四个方向的移动向量,然后在dfs函数中,它递归地搜索每个可能的方向,直到找到匹配的单词或者确定单词不存在。exist函数遍历网格的每个位置,以每个位置为起点调用dfs函数进行搜索。如果dfs函数返回true,则表示找到了单词,exist函数也会返回true。如果遍历完整个网格都没有找到单词,则exist函数返回false。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024 睿抗机器人开发者大赛(RAICOM)-【网络安全】CTF 部分WP

文章目录 一、前言二、MICS你是黑客么循环的压缩包Goodtime 三、WEBpy 四、Crypto变异凯撒RSAcrypto3 一、前言 WP不完整&#xff0c;仅供参考&#xff01; 除WEB&#xff0c;RE&#xff0c;PWN外&#xff0c;其余附件均已打包完毕 也是一个对MISC比较友好的一个比赛~ 123网…

鲸鱼优化算法(Whale Optimization Algorithm, WOA)原理与MATLAB例程

鲸鱼优化算法&#xff08;Whale Optimization Algorithm, WOA&#xff09;是一种基于鲸鱼捕食行为的智能优化算法。它模拟了座头鲸在狩猎时的“气泡网”捕食策略。 文章目录 1.适应度函数2. 更新公式2.1 突袭行为2.2 螺旋更新3.线性递减参数4. 边界处理 MATLAB 实现示例代码说明…

C语言程序设计:现代设计方法习题笔记《chapter3》

第一题 ​ 代码示例&#xff1a; #include<stdio.h>int main() {printf("Enter a date&#xff08;mm/dd/yyyy&#xff09;: ");int day, month, year;scanf_s("%d/%d/%d", &month, &day, &year);printf("%04d%02d%02d", yea…

一款好用的搜索软件——everthing(搜索比文件资源管理器快)

everthing官网链接 在官网选择下载 1.下载后双击打开 2.点击OK&#xff08;需要其他语言自己选择&#xff09; 3.选择安装位置&#xff08;路径最好别带中文和空格&#xff09; 继续点击下一步 4. 点击下一步 5.继续点击安装 6.然后就完成了 7.点击打开然后就可以搜索了

Elastic Stack简介

本文内容参考了田雪松老师编著的《Elastic Stack应用宝典》 从ELK到Elastic Stack ELK是三个单词的首字母缩写&#xff0c;即Elasticsearch、Logstash和Kibana。 Elasticsearch用于数据存储与检索Logstash用于数据传输与清洗Kibana则用于数据可视化等领域 Elasticsearch的第…

AnaTraf | 网络性能监控系统NPM:提升网络性能与业务连续性

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 网络系统非常复杂&#xff0c;管理和维护它们也越来越具有挑战性。为了确保网络性能和业务的持续稳定运行&#xff0c;IT运维团队需要对网络进行实时监控、优化和快速排查故障。本文将围绕网络性能监控系统&…

raidrive 访问搭建的ftp服务报错超时的情况

尝试了很久&#xff0c;包括改用户权限和密码&#xff0c;后面根据ftp日志&#xff0c;查到用户登录是正常的 /var/log/vsftpd.log 就知道&#xff0c;不是密码问题也不是服务器端的问题&#xff0c;通过多次尝试发现是被动模式的问题&#xff0c;被动模式会通过其他端口进行交…

ChatGPT实现旅游推荐微信小程序

随着旅游行业的快速发展&#xff0c;个性化推荐已成为提升用户体验的重要手段。通过AI技术&#xff0c;提供一个智能旅游推荐小程序&#xff0c;使用户能够轻松获取定制化的旅行建议。 项目概述 项目目标 开发一个AI旅游推荐小程序&#xff0c;基于用户输入的旅行偏好&#…

前后端请求、返回数据的多种方式

Springboot项目的业务逻辑 &#x1f319;项目基本结构&#xff1a; 通常情况下&#xff0c;我们在搭建后端项目的时候&#xff0c;处理业务逻辑我们需要用到Controller,Service,Mapper(mybatis,mybatis-plus)&#xff0c;Entry各层之间的相互调用来完成&#xff0c;还有就是我…

Docker部署MySQL主从复制

1. 主从复制概念及优势 1.1 概念 MySQL主从复制是一种数据库复制技术&#xff0c;它允许将一个数据库服务器&#xff08;主服务器&#xff09;上的数据更改复制到一个或多个数据库服务器&#xff08;从服务器&#xff09;。这种技术在数据库管理和维护中扮演着重要的角色&…

Ubuntu 2张4090,显卡安装,无法双屏显示

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; Ubuntu20.04 安装nvidia显卡 在已经安装好nvidia显卡的情况下&#xff1a; 单屏幕无法修改屏幕分辨率 无法双屏显示 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 单屏幕无法…

【Origin科技绘图】最新Origin2024中文版软件安装教程

Origin是由OriginLab公司开发的一个科学绘图、数据分析软件,支持在MicrosoftWindows下运行。Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计,信号处理,曲线拟合以及峰值分析。Origin中的曲线拟合是采用基Levernberg-Marquardt算法(LMA)的非线性最小二乘法拟合…

理工科考研想考计算机,湖南大学、重大、哈工大威海、山东大学,该如何选择?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 计算机对理工科同学来说&#xff0c;还是性价比很高的&#xff0c;具有很大的优势&#xff01; 一、就业前景广阔 高需求行业 在当今数字化时代&#xff0c;计算机技术几乎渗透到了各个领域&#xff0c;无论是互联网…

LabVIEW提高开发效率技巧----插入式架构

随着LabVIEW项目规模的扩大和系统复杂性的增加&#xff0c;传统的单一代码架构难以应对后期维护和功能扩展的需求。插入式架构&#xff08;Plug-In Architecture&#xff09;作为一种模块化设计方式&#xff0c;通过动态加载和运行子VI&#xff0c;使系统功能更加灵活、模块化&…

Django从请求到响应

视图 一个视图函数&#xff0c;简称视图&#xff0c;是一个简单的Python函数 def view_name() 定义视图函数view_name() URL的常用配置 path函数&#xff1a; path(route,view,name,**kwargs) route&#xff1a;RUL匹配规则 view&#xff1a;视图函数 name&#xf…

【部署篇】RabbitMq-03集群模式部署

一、准备主机 准备3台主机用于rabbitmq部署&#xff0c;文章中是在centos7上安装部署rabbitmq3.8通过文章中介绍的方式可以同样在centos8、centos9上部署&#xff0c;只需下载对应的版本进行相同的操作。 主机IP角色说明192.168.128.31种子节点192.168.128.32普通节点192.16…

React 分装webSocket

背景 AI 实时对话 需要流式数据 React Hooks 写法。新建WebSocket.tsx 放在根目录components import { useCallback, useRef, useState } from react;type MessageHandler (message: MessageEvent) > void; type ErrorHandler (event: Event) > void;export functi…

技术成神之路:设计模式(二十二)命令模式

介绍 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;允许将请求&#xff08;命令&#xff09;封装为对象&#xff0c;从而使您可以使用不同的请求、队列或记录请求日志&#xff0c;以及支持可撤销操作。 1. 定义 命令模式将一个请求封装为一个…

S32DS for ARM GPIO实践

S32DS操作&#xff1a; 一、新建项目 打开S32DS&#xff0c;FIle–>NEW–> S32DS Application Project选择对应芯片&#xff0c;写入项目名然后下一步 选择对应的SDK&#xff0c;Debugger选带有PE字眼的&#xff0c;点击完成 配置GPIO&#xff0c;双击Components界面下的…

【MySQL】详解MySQL数据类型

一、数据类型 各类型的数值范围&#xff1a; 在MySQL中&#xff0c;整型可以指定是有符号的和无符号的&#xff0c;默认是有符号的。 可以通过UNSIGNED来说明某个字段是无符号的。对于int类型可能存放不下的数据&#xff0c;尽量不使用unsigned&#xff0c;unsigned int 同样可…