LCR 129. 字母迷宫

news/2025/10/10 0:26:23/文章来源:https://www.cnblogs.com/Lantz12/p/19132251

LCR 129. 字母迷宫

LCR 129. 字母迷宫

参考题解:灵神题解

解题思想

首先我们知道该题需要枚举i=0,1,2,...,n-1j = 0,1,2,3,...,m-1,以(i,j)为起点开始搜索

同时我们还需要知道target匹配到了哪个字符,定义一个记录参数k

定义一个dfs(i, j, k)深度搜索函数表示当前这个格子,是否匹配target(k),匹配返回true,否则false

对于dfs(i,j,k)分类讨论:

  • 如果grid[i,j]不等于target[k],返回false
  • 如果参数k等于target的长度 - 1,即k=len(target)-1,返回true
  • 枚举(i,j)的相邻的四个格子(x,y),如果(x,y)没有出界,则递归dfs(x,y,k+1),如果返回true,那么dfs(i,j,k)就一定也是true
  • 如果四个相邻格子都是false,那就返回false

避免重复访问细节

为了避免重复访问同一个格子,可以使用vis数组标记每一个访问过的字符,但是更方便的可以直接将grid[i,j]先设为0,如果返回false直接恢复现场,返回true就不用恢复现场,因为已经匹配到了

代码展示:

public boolean dfs( int i, int j, int k, char[][] grid, char[] target) {// 字符串数组的字符和 target 中的不匹配if(grid[i][j] != target[k]) {return false;}// 成功匹配记录数字 k 的值等于 target 的长度if(k == target.length - 1) {return true;}grid[i][j] = 0; // 标记访问过for(int[] d: DIRS) {int x = i + d[0];int y = j + d[1];if(0 <= x && x <= grid.length - 1 && 0 <= y && y <= grid[x].length - 1 && dfs(x, y, k + 1, grid, target)) {return true; // 成功搜到}}// 没搜到grid[i][j] = target[k]; // 恢复现场return false;}

可优化的点

优化1

如果grid中的某个字符出现的次数比target中对应的字符出现的次数大,返回false

// 优化1
char[] t = target.toCharArray();
int[] targetCnt = new int[128];
for(int c: t) {if(++targetCnt[c] > cnt[c]) {return false; // grid 某个字符和 target 对应的字符出现次数不符}
}

优化2

假设target的首字符出现的次数为x,末尾字符出现的次数为y,如果x > y,那么就将target反转,这样在一开始就满足了grid[i][j] != target[k],不用接着往后搜索了

// 优化 2
if(cnt[t[t.length - 1]] < cnt[t[0]]) {t = new StringBuilder(target).reverse().toString().toCharArray();
}

最终代码展示

class Solution {private static final int[][] DIRS = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};public boolean wordPuzzle(char[][] grid, String target) {// 用数组代替哈希表int[] cnt = new int[128];for (char[] row : grid) {for (char c : row) {cnt[c]++; // 将cnt[c]的值加1,做好 key-value}}// 优化1char[] t = target.toCharArray();int[] targetCnt = new int[128];for(int c: t) {if(++targetCnt[c] > cnt[c]) {return false; // grid 某个字符和 target 对应的字符出现次数不符}}// 优化 2if(cnt[t[t.length - 1]] < cnt[t[0]]) {t = new StringBuilder(target).reverse().toString().toCharArray();}for(int i = 0; i < grid.length; i++) {for(int j = 0; j < grid[i].length; j++) {if(dfs(i, j, 0, grid, t)) {return true; // 搜到了}}}return false;}public boolean dfs( int i, int j, int k, char[][] grid, char[] target) {// 字符串数组的字符和 target 中的不匹配if(grid[i][j] != target[k]) {return false;}// 成功匹配记录数字 k 的值等于 target 的长度if(k == target.length - 1) {return true;}grid[i][j] = 0; // 标记访问过for(int[] d: DIRS) {int x = i + d[0];int y = j + d[1];if(0 <= x && x <= grid.length - 1 && 0 <= y && y <= grid[x].length - 1 && dfs(x, y, k + 1, grid, target)) {return true; // 成功搜到}}// 没搜到grid[i][j] = target[k]; // 恢复现场return false;}
}

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

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

相关文章

先进反应堆:BWRX-300

先进反应堆:BWRX-300 在众多小型模块化反应堆(SMR)的技术路线中,由GE Vernova(GE公司在2022年被拆分为3个公司,其中能源板块改名为 GE Vernova)和日立(Hitachi)的合资企业GVH(GE Hitachi Nuclear Energy)开…

ch58x/ch59x系列芯片Indication添加

前言: 一般在使用BLE协议进行数据传输,会优先考虑Peripheral(外设从机角色例程)。在CH58x的SDK中,自定义包含五种不同属性的服务,包含可读、可写、通知、可读可写、安全可读,唯独没有indication属性的特征值。本…

Lab 4 Challenge - Sum of Proper Elements

source code 主方法 主类 public class SumOfProperElements {public static int sumOfProper(int[] nums) {int sum = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] % (i + 1) == 0) {sum += nums[i];}…

Ignite3 竟然变成分布式数据库了!

Ignite3 怎么变成一个分布式数据库了? 这个问题问得非常好。 Apache Ignite 3(正式名:Apache Ignite 3.x)之所以被称为“分布式数据库”,而不仅仅是 Ignite 2 那样的“内存数据网格 (IMDG)”,是因为它在架构、存…

NUIST 《程序设计基础》 实验1

NUIST 《程序设计基础》 实验1 这是我的第一个实验 实验任务1 #include <stdio.h>int main() {printf(" o \n<H>\nI I\n");return 0; }实验任务2 #include<stdio.h> #include<stdlib.h…

[MIT 6.828] Lab 1 C, Assembly, Tools, and Bootstrapping

2018 版的,不是课改后的 MIT 6.S081,课改前的好像更细致一些。之前学的都太零碎了,过一遍这个课程,用以构建整体的 OS 知识体系。 课程讲义:https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf,课程安排…

WCH低功耗蓝牙系列芯片usb烧录故障排查

正常识别:可以在设备管理器中识别出USB Module使用USB烧录的一般操作:按住评估板上的“Download”按键,或者将PB22短接到GND,同时给板子上电。若是第一次拿到芯片,codeflash中是空的,不用按住“Download”按键也…

使用docker构建.net api镜像及nginx反向代理 - binzi

一、使用docker构建.net api镜像并且运行容器 如果你使用的是windows,确保你已经安装了docker 打开Windows PowerShell 运行docker version如果能显示客户端和服务端信息,说明 Docker 环境正常。 在webapi中右键dock…

利用sprintf与snprintf巧妙实现数值变量转换为字符串型

0.前情提要 这是在搞STM32开发时遇到的一个问题,要将数字通过串口发送给上位机,但是HAL库中的HAL_UART_Transmit函数只接受uint8_t *类型的参数,因此我们需要通过一个函数先将数值类型变量转换为char *字符串,再强…

Helmholtz-Gibbs自由能与熵弹性

2025.10.09 开坑Helmholtz 自由能定义:热力学中一个非常重要的势函数,常用于描述恒温(Isothermal)和恒容(Isochoric)条件下的系统。 Helmholtz 自由能的定义公式可以写为 \[ \psi = \]Gibbs 自由能定义 熵弹性定…

日志|电话号码的字母组合|子集|回溯

解题思路:回溯三问:1.当前操作?枚举数组path[i]要填入的字母 2.子问题?构造字符串>= i 的部分 3.下一个子问题?构造>= i+1 的部分对于本题1.当前操作:枚举放入path当前i的字母 例如第2个数字对应的a b c …

Rust 的验证码图像识别系统设计与实现

一、研究背景 验证码(CAPTCHA)是互联网安全中最常见的防护手段之一,用于区分人类用户与自动化程序。 近年来,随着OCR(Optical Character Recognition,光学字符识别)与机器学习的发展,验证码识别已成为人工智能…

Docker实用篇(初识Docker,Docker的基本操作,Dockerfile自定义镜像,Docker-Compose,Docker镜像仓库) - a

Docker实用篇(初识Docker,Docker的基本操作,Dockerfile自定义镜像,Docker-Compose,Docker镜像仓库) 目录Docker实用篇(初识Docker,Docker的基本操作,Dockerfile自定义镜像,Docker-Compose,Docker镜像仓库)0.学习目…

ROIR 2023

ROIR 2023 评分 \(\in[0,10]\)。 https://www.luogu.com.cn/problem/list?type=luogu&page=1&tag=479|60&orderBy=pid&order=asc 矩形分割 (Day 1) \(3\)。 根据题意列出二元二次方程,用 \(k\) 换元…

【题解】P12992 [GCJ 2022 #1C] Intranets

以此纪念我洛谷 AC 的第 \(999\) 个题。 \(2025.10.09\) 题意: 天网是一张无向图 \(G\) ,包含 \(n\) 个点。一开始,天网上没有任何边。你以等概率随机顺序依次对所有的点对尝试加边。 每次尝试加边 \((u,v)\) 的时候…

ysyx:pa3.1批处理系统

ysyx:pa3.1批处理系统批处理系统 为了让管理员事先准备好一组程序, 让计算机执行完一个程序之后, 就自动执行下一个程序,提出了批处理系统的思想。处理系统的关键, 就是要有一个后台程序, 当一个前台程序执行结束的时…

基于 C 语言的验证码图像识别系统实现

一、项目背景 验证码(CAPTCHA, Completely Automated Public Turing test to tell Computers and Humans Apart)是一种常见的安全验证手段,用于防止机器自动提交表单、恶意注册等操作。随着计算机视觉与OCR(光学字…

C++篇:003

C++篇:003$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");C++篇:003.STL 一、STL概述 从根本上说,STL是一些“容器”的集合,也是算法和其他一些组件的集…

C 语言的验证码图像识别系统实现

一、项目背景 验证码(CAPTCHA, Completely Automated Public Turing test to tell Computers and Humans Apart)是一种常见的安全验证手段,用于防止机器自动提交表单、恶意注册等操作。随着计算机视觉与OCR(光学字…

oppoR9m刷Linux系统: 引导知识

前言全局说明注意:刷机,会丢失用户:照片、聊天等信息资料。请备份基带等信息。请慎重刷机 !!! 注意:刷机,会丢失用户:照片、聊天等信息资料。请备份基带等信息。请慎重刷机 !!! 注意:刷机,会丢失用户:照片、聊…