当前位置: 首页 > news >正文

LeetCode 算法:单词搜索 c++

原题链接🔗:单词搜索
难度:中等⭐️⭐️

题目

给定一个 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 仅由大小写英文字母组成

题解

  1. 解题思路

LeetCode上的“单词搜索”问题是一个典型的回溯算法问题。这个问题的基本思路是在一个二维字符数组中搜索一个给定的单词,单词可以按任意方向(水平、垂直、对角线)进行搜索。以下是解题的基本步骤和思路:

  • 问题描述

    • 给定一个二维字符数组 board 和一个单词 word,找出 word 是否存在于 board 中。单词必须按字母顺序通过相邻的单元格(水平、垂直或对角线)拼写,并且只能使用每个单元格一次。
  • 解题思路

    • 定义搜索函数:定义一个递归函数 search,该函数接收当前位置 (i, j) 和当前单词的索引 k。
    • 检查当前字符:如果当前位置的字符与单词的当前字符不匹配,则返回 false。
    • 检查边界:如果 i 或 j 超出数组边界,或者当前字符不匹配,则返回 false。
    • 标记访问:将当前位置的字符暂时替换为一个特殊字符(如 ‘#’),以防止重复访问。
    • 递归搜索:在当前位置的四个方向(上、下、左、右)递归调用 search 函数。
    • 回溯:无论搜索是否成功,都需要将当前位置的字符恢复为原始字符,以便其他路径可以访问。
    • 返回结果:如果搜索到单词的最后一个字符,返回 true。
  1. c++ demo:
#include <vector>
#include <string>
#include <iostream>using namespace std;
class Solution {
public:bool exist(vector<vector<char>>& board, const string& word) {int m = board.size();int n = board[0].size();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (board[i][j] == word[0] && dfs(board, word, i, j, 0)) {return true;}}}return false;}private:bool dfs(vector<vector<char>>& board, const string& word, int x, int y, int k) {if (k == word.size()) return true; // 单词搜索完成if (x < 0 || y < 0 || x >= board.size() || y >= board[0].size() || board[x][y] != word[k]) return false; // 越界或字符不匹配char temp = board[x][y]; // 标记访问board[x][y] = '#';// 搜索四个方向if (dfs(board, word, x + 1, y, k + 1) || dfs(board, word, x - 1, y, k + 1) ||dfs(board, word, x, y + 1, k + 1) || dfs(board, word, x, y - 1, k + 1)) {return true;}board[x][y] = temp; // 回溯return false;}
};int main() {Solution solution;vector<vector<char>> board = {{'A', 'B', 'C', 'E'},{'S', 'F', 'C', 'S'},{'A', 'D', 'E', 'E'}};string word = "ABC";if (solution.exist(board, word)) {std::cout << "Word found in the board." << std::endl;}else {std::cout << "Word not found in the board." << std::endl;}return 0;
}
  • 输出结果:

Word found in the board.

  1. 代码仓库地址: exist

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 阿里大数据面试题集锦及参考答案(持续更新)
  • IP溯源工具--IPTraceabilityTool
  • 高性能、安全、低碳绿色的趋势下,锐捷网络发布三擎云办公解决方案 3.0
  • 从人工巡检到智能防控:智慧油气田安全生产的新视角
  • 如何在 Vue 和 JavaScript 中截取视频任意帧图片
  • 基于JAVA+SpringBoot+uniapp的心理小程序(小程序版本)
  • [web]-反序列化-绕过__wakeup(转)
  • JAVA:Filer过滤器+案例:请求IP访问限制和请求返回值修改
  • 在Ubuntu 12.04上安装和设置Postfix的方法
  • Xcode进行真机测试时总是断连,如何解决?
  • 界面控件DevExpress Blazor UI v24.1 - 发布全新TreeList组件
  • 小阿轩yx-高性能内存对象缓存
  • 谷粒商城-全文检索-ElasticSearch
  • 昇思25天学习打卡营第16天|基于MindSpore通过GPT实现情感分类
  • 接口防刷!利用redisson快速实现自定义限流注解
  • [NodeJS] 关于Buffer
  • 【译】理解JavaScript:new 关键字
  • Android交互
  • android图片蒙层
  • C++11: atomic 头文件
  • Docker容器管理
  • Mocha测试初探
  • Node项目之评分系统(二)- 数据库设计
  • STAR法则
  • 闭包--闭包作用之保存(一)
  • 前嗅ForeSpider中数据浏览界面介绍
  • 世界上最简单的无等待算法(getAndIncrement)
  • 怎样选择前端框架
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​用户画像从0到100的构建思路
  • # Maven错误Error executing Maven
  • #Java第九次作业--输入输出流和文件操作
  • #pragma once
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (ZT)出版业改革:该死的死,该生的生
  • (不用互三)AI绘画工具应该如何选择
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (汇总)os模块以及shutil模块对文件的操作
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)3D模板阴影原理
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转载)从 Java 代码到 Java 堆
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • ../depcomp: line 571: exec: g++: not found
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • @Value读取properties中文乱码解决方案
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [BZOJ 3282] Tree 【LCT】
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C#]winform部署yolov5-onnx模型