回溯--字母迷宫

1.题目描述

字母迷宫游戏初始界面记作 m x n 二维字符串数组 grid,请判断玩家是否能在 grid 中找到目标单词 target。
注意:寻找单词时 必须 按照字母顺序,通过水平或垂直方向相邻的单元格内的字母构成,同时,同一个单元格内的字母 不允许被重复使用 。

示例 1:

输入:grid = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], target = "ABCCED"
输出:true

示例 2:

输入:grid = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], target = "SEE"
输出:true

示例 3:

输入:grid = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], target = "ABCB"
输出:false

提示:

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

2.算法思路

设函数 wordPuzzle(i,j,k)表示判断以网格的 (i,j) 位置出发,能否搜索到单词 word[k..],其中 word[k..] 表示字符串 word 从第 k 个字符开始的后缀子串。如果能搜索到,则返回 true,反之返回 false。函数 wordPuzzle(i,j,k) 的执行步骤如下:

  • 如果 grid[i][j]≠s[k]],当前字符不匹配,直接返回 false。
  • 如果当前已经访问到字符串的末尾,且对应字符依然匹配,此时直接返回 true。
  • 否则,遍历当前位置的所有相邻位置。如果从某个相邻位置出发,能够搜索到子串 word[k+1..],则返回 true,否则返回 false。

这样,我们对每一个位置 (i,j) 都调用函数 wordPuzzle(i,j,0) 进行检查:只要有一处返回 true,就说明网格中能够找到相应的单词,否则说明不能找到。

为了防止重复遍历相同的位置,需要额外维护一个与 grid 等大的 visited 数组,用于标识每个位置是否被访问过。每次遍历相邻位置时,需要跳过已经被访问的位置。

3.代码实现

public boolean wordPuzzle(char[][] grid, String target) {
        char[] words = target.toCharArray();
        for(int i = 0; i < grid.length; i++) {
            for(int j = 0; j < grid[0].length; j++) {
                if(dfs(grid, words, i, j, 0)) return true;
            }
        }
        return false;
    }
    boolean dfs(char[][] grid, char[] target, int i, int j, int k) {
        if(i >= grid.length || i < 0 || j >= grid[0].length || j < 0 || grid[i][j] != target[k]) return false;
        if(k == target.length - 1) return true;
        grid[i][j] = '\0';
        boolean res = dfs(grid, target, i + 1, j, k + 1) || dfs(grid, target, i - 1, j, k + 1) || 
                      dfs(grid, target, i, j + 1, k + 1) || dfs(grid, target, i , j - 1, k + 1);
        grid[i][j] = target[k];
        return res;
    }

4.参考题目

力扣

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SSM民宿在线预订平台的设计与实现-计算机毕业设计源码44449

摘 要 信息化社会内需要与之径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对民宿在线预订平台等问题&#xff0c;对民宿信息管理进行研究分…

【Qt知识】Qt窗口坐标系

Qt的窗口坐标体系遵循标准的计算机图形坐标系统规则 Qt窗口坐标体系特点 坐标原点&#xff1a;窗口坐标体系的原点位于窗口的左上角&#xff0c;即坐标(0, 0)位置。 轴方向&#xff1a; X轴&#xff1a;向右为正方向&#xff0c;随着X坐标值的增加&#xff0c;元素在窗口中从…

Honor of Kings 2024.06.03 50star (S35) AFK

Honor of Kings 2024.06.03 50star (S35) AFK 来个赛季S35总结吧&#xff0c;这个赛季结束以后&#xff0c;可能要和【魔兽世界】一样AFK了&#xff0c;手游来说肯定没法子和WOW相比&#xff0c;干啥都是有队友才好玩。 我玩的基本都是肉&#xff0c;爆发强的英雄&#xff0c;最…

重学java 57.哈希表结构存储过程

别焦虑&#xff0c;生活无非见招拆招 —— 24.6.3 哈希表存储数据去重复的过程: a.先比较元素的哈希值(重写hashCode),再比较内容(重写equals) b.如果哈希值不一样,证明内容不一样,存 c.如果哈希值一样,再比较内容 如果哈希值一样,内容不一样(哈希碰撞,哈希冲突),存 如果哈希值…

FASTGPT:可视化开发、运营和使用的AI原生应用

近年来&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI的应用逐渐渗透到各行各业。作为一种全新的开发模式&#xff0c;AI原生应用正逐步成为行业的焦点。在这方面&#xff0c;FASTGPT无疑是一款颇具代表性的产品。本文将详细介绍FASTGPT的设…

再说零信任

什么是零信任&#xff1f; 2010年&#xff0c;由著名研究机构Forrester的首席分析师John Kindervag最早提出了零信任(Zero Trust)的概念&#xff0c; 并由Google在BeyondCorp项目中率先得到了应用&#xff0c;很好的解决了边界安全理念难以应对的安全问题。 我们的网络无时无…

C++多线程同步

C使用多线程必须包含头文件 #include <thread> 来实现 当多个线程同事访问一个对象的时候&#xff0c;会产生数据竞争现象。 这个时候&#xff0c;就可以加锁&#xff0c;同步资源&#xff0c;解决数据竞争。 最简单就是互斥锁mutex 上代码&#xff0c;计算一个数自增到1…

3d模型批量渲图总是会跳怎么办?---模大狮模型网

在进行3D模型批量渲染时&#xff0c;有时会遇到一些问题&#xff0c;其中一个常见的问题就是渲染过程中出现跳帧或者跳图的情况。这不仅会影响到效率&#xff0c;还可能导致输出结果不符合预期。本文将介绍几种解决这一问题的方法&#xff0c;帮助读者更好地应对3D模型批量渲图…

union all 以及标量子查询执行计划

SELECT 1, (SELECT ID1 FROM TE WHERE IDA.ID2) FROM .TA A WHERE COLA X UNION ALL SELECT 1, (SELECT ID2 FROM TD WHERE IDA.ID1) FROM .TB A WHERE COLA X UNION ALL SELECT 1,COL2 AS PARENT_UUID FROM .TC a WHERE COLA X 三个union all 看着像是5个table joi…

正则表达式-是什么?规则有哪些?

正则表达式&#xff08;Regular Expression&#xff0c;常简写为regex、regexp或RE&#xff09;是一种文本模式&#xff0c;包括普通字符&#xff08;如a到z之间的字母&#xff09;和特殊字符&#xff08;称为“元字符”&#xff09;&#xff0c;用于描述、匹配一系列符合某个句…

鸿蒙Ability Kit(程序框架服务)【ExtensionAbility组件】

ExtensionAbility组件 ExtensionAbility组件是基于特定场景&#xff08;例如服务卡片、输入法等&#xff09;提供的应用组件&#xff0c;以便满足更多的使用场景。 每一个具体场景对应一个[ExtensionAbilityType]&#xff0c;开发者只能使用&#xff08;包括实现和访问&#…

跨平台,不需要下载的串口调试助手

在线串口调试助手是BBAIoT旗下的首款物联网工具&#xff0c;web端显示&#xff0c;不需要下载任何软件到电脑&#xff0c;方便快捷。 在线串口调试 链接地址&#xff1a;在线串口调试在线串口调试助手 Online serial port debugging assistanthttps://www.bbaiot.com/ 软件界…

转行要趁早?2024网络安全热门岗位大盘点

2024年 热门网络安全职位排名 TOP5 热门****程度&#xff1a; 幕后默默守护的工匠&#xff01;构建安全的网络堡垒&#xff0c;跨团队合作&#xff0c;让安全防线更加坚固。 安全架构师的工作是发现企业内潜在的 IT 和网络漏洞。他们与自己团队的其他科技专业人士合作&#x…

[FreeRTOS 基础知识] 栈

文章目录 栈的概念使用C语言实现 栈通过代码反汇编解析 栈 栈的概念 所谓的栈就是一块空间的内存&#xff0c;CPU的SP寄存器指向它&#xff0c;它可以用于函数调用&#xff0c;局部变量&#xff0c;多任务系统里保存现场。 使用C语言实现 栈 volatile int num0;int fun_b(vol…

大模型ChatGLM的部署与微调

前言&#xff1a;最近大模型太火了&#xff0c;导师让我看看能不能用到自己的实验中&#xff0c;就想着先微调一个chatGLM试试水&#xff0c;微调的过程并不难&#xff0c;难的的硬件条件跟不上&#xff0c;我试了一下lora微调&#xff0c;也算跑通了吧&#xff0c;虽然最后评估…

聚类算法—DBSCAN算法

文章目录 DBSCAN算法基本概念1个核心思想&#xff1a;基于密度2个算法参数&#xff1a;邻域半径R和最少点数目minpoints3种点的类别&#xff1a;核心点&#xff0c;边界点和噪声点4种点的关系&#xff1a;密度直达&#xff0c;密度可达&#xff0c;密度相连&#xff0c;非密度相…

2024-6-3 石群电路-22

2024-6-3&#xff0c;星期一&#xff0c;20:45&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;阴转晴。今天没有发生了一些令人不开心事情&#xff0c;心情有些差&#xff0c;不过还是调整过来了&#xff0c;活好自己&#xff0c;就是对你讨厌的人最大的惩罚。因为…

jdk的组成和跨平台原理

为什么 1.笔试会用到 2. 方便理解程序的运行 java跨平台的原因&#xff1a; sun公司提供了各种平台可以使用的jvm,所以java将程序一次编译成字节码之后可以给各种平台运行。这也是java这么多年深受欢迎的原因

GB28181安防视频融合汇聚平台EasyCVR如何实现视频画面自定义标签?

安防视频融合汇聚平台EasyCVR兼容性强&#xff0c;可支持Windows系统、Linux系统以及国产化操作系统等&#xff0c;平台既具备传统安防视频监控的能力&#xff0c;也具备接入AI智能分析的能力&#xff0c;可拓展性强、视频能力灵活&#xff0c;能对外分发RTMP、RTSP、HTTP-FLV、…

Fatfs

STM32进阶笔记——FATFS文件系统&#xff08;上&#xff09;_stm32 fatfs-CSDN博客 STM32进阶笔记——FATFS文件系统&#xff08;下&#xff09;_stm32 文件系统怎样获取文件大小-CSDN博客 STM32——FATFS文件基础知识_stm32 fatfs-CSDN博客 021 - STM32学习笔记 - Fatfs文件…