从零学算法79
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
- 我的思路:首先由于不确定从哪个点开始可以构成目标单词,所以肯定是枚举每个点作为起点。这种路径问题,想都不用想肯定是 dfs,先想一下入参,当我从某个点开始找,那肯定入参要有坐标,我们还需要知道已经匹配到哪一步了,所以用一个数字来表示已匹配的单词字符数;接着就是出口,首先出了边界肯定要返回 false,由于题目说不能重复使用,所以递归过程中遇到重复的坐标也要返回 false,当然最容易想到的,当前坐标的字符和目标单词当前匹配字符不匹配也肯定返回 false。当匹配到最后一个字符时还没有返回 false,自然是只能返回 true 了。最后就是 dfs 的每一步的内容。由于方向不定,所以往上下左右寻找下一位匹配字符,有一个满足就继续寻找即可。
-
String WORD;char[][] BOARD;int m,n;public boolean exist(char[][] board, String word) {BOARD = board;WORD = word;m=board.length;n=board[0].length;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(dfs(i,j,0))return true;}}return false;}public boolean dfs(int x,int y,int cur){// 超过边界if(x < 0 || x >= m || y < 0 || y >= n)return false;// word 的某一位字符和当前坐标处字符不匹配if(WORD.charAt(cur) != BOARD[x][y])return false;if(cur == WORD.length()-1 )return true;// 为了防止重复将字符置为空,这样下次和坐标处字符必定不匹配BOARD[x][y] = '\0';boolean up = dfs(x-1,y,cur+1);boolean down = dfs(x+1,y,cur+1);boolean left = dfs(x,y-1,cur+1);boolean right = dfs(x,y+1,cur+1);// 还原字符BOARD[x][y] = WORD.charAt(cur);return up || down || left || right;} - 上面的还原字符有必要说一下,这是我唯一没想到的一点。无论你用什么方式来防止重复访问某个坐标,你都需要还原这一步。我原本以为用一个 hashSet 记录该坐标是否访问过,下一次访问直接返回 false 即可。但是假设一条错误的路径会经过比如坐标 [2,2],然后将其标记为已访问过,最终该路径结果返回 false。但是,有可能正确的路径也包含了这个坐标 [2,2],但是由于错误路径提前把这个坐标访问掉了,所以你正确的路径反而没法访问了,到这个坐标直接返回了 false,所以需要还原。之所以这样能还原,我个人理解是因为比如还是 [2,2] 这个点,错误路径为
[1,2]->[2,2]->...然后返回 false。而正确路径比如为[1,2]->[1,3]->[2-3]->[2,2]->...然后返回 true。在错误路径代码执行期间,在递归的第二层把 [2,2] 置空,之后的每一层递归都将无法访问这个点,而正确路径在递归的第四层才访问这个点,这时候当然无法访问了;而还原也就意味着,当那些错误的可能性被否决,只要你能够回溯到第二层递归,就代表我在第二层就把 [2,2] 用掉是不可行的,也就是说在第二层不能把 [2,2] 用掉。那么我自然要给你重新访问 [2,2] 的机会,所以有还原操作。也就是说我给错误路径访问 [2,2],他不中用,那我换个人给机会,肯定要公平地也给你一次访问 [2,2] 的机会。
相关文章:
从零学算法79
79.给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直…...
ctfshow-web-红包题第六弹
0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先跑一下字典,这里用的dirmap,可以看到有一个web.zip 下载下来之后发现是一个网站备份,备份的是check.php.bak 然后接着看,可以看到这里不太可能是sql注入,有…...
蓝蓝设计UI设计公司-界面设计与开发案例
天津航天中为项目 中国南方电网十二个软件交互优化和界面设计 图标设计 | 交互设计 | 界面设计 天津航天中为数据系统科技有限公司是航天503所控股的专业化公司,坐落于天津滨海新区航天技术产业园,是航天五院家入住天津未来科技城的军民融合型企业&…...
IDEA 配置注释模板
目录 一、配置类模板注释 二、配置方法注释 一、配置类模板注释 打开IDEA,打开settings(快捷键:Ctrl Alt s),选择Editor,找到File and Code Templates,设置需要配置注释的文件类型,如下图所示…...
Kuka机器人设计通用码垛程序
假设需要一个码垛程序, 从输送线抓到托盘, 托盘每层4个, 需要码5层, 可以用以下程序架构设计: 1, 再config中定义层数cengshu , 每层码垛的个数(码垛的次数)cishu , 每层的高度levelHeight , 码垛放置点的集合putPoint[,] ,预放点1集合prePut1[,], 预放点2集合prePut2[,] DEC…...
pandas由入门到精通-数据清洗-扩展数据类型
pandas-02-数据清洗&预处理 扩展数据类型1. 传统数据类型缺点2. 扩展的数据类型3. 如何转换类型文中用S代指Series,用Df代指DataFrame 数据清洗是处理大型复杂情况数据必不可少的步骤,这里总结一些数据清洗的常用方法:包括缺失值、重复值、异常值处理,数据类型统计,分…...
深入理解 Vue Router:构建可靠的前端路由系统
目录 01-什么是前端路由以及路由两种模式实现原理02-路由的基本搭建与嵌套路由模式03-动态路由模式与编程式路由模式04-命名路由与命名视图与路由元信息05-路由传递参数的多种方式及应用场景06-详解route对象与router对象07-路由守卫详解及应用场景 01-什么是前端路由以及路由两…...
Mysql B+数索引结构
一、B树和B树区别 二、 B 树形成过程 三、页分裂过程 3.1 页分裂过程实例 3.1.1 原有数据1、3、5形成如下数据页 3.1.2 先新插入数据4,因为 页10 最多只能放3条记录所以我们不得不再分配一个新页: 新分配的数据页编号可能并不是连续的,也…...
在window上配置NASM
NASM是支持x86、x64架构CPU的汇编器(汇编软件);NASM也支持大量的文件格式,包括Linux,*BSD,a.out,ELF,COFF,Mach−O,Microsoft 16−bit OBJ,Win32以及Win64,同…...
用QT实现MVP模式
近些天用qt 作项目,遇到参数界面.偷闲写个mvp模式示例. mvp模式重要的有两点 1 低耦合: 界面与后端数据类,不直接引用,可方便替换. 2 形成界面驱动-界面更新的闭环.:通过函数指针类技术,让数据自动回流. MVP (Model-View-Presenter) 视图(View): 接…...
(2023)Linux安装pytorch并使用pycharm远程编译运行
(2023)Linux安装pytorch并使用pycharm远程编译运行 安装miniconda 这部分参考我这篇博客的前半部分Linux服务器上通过miniconda安装R(2022)_miniconda 安装r_Dream of Grass的博客-CSDN博客 创建环境 创建一个叫pytorch的环境…...
poi带表头多sheet导出
导出工具类 package com.hieasy.comm.core.excel;import com.hieasy.comm.core.excel.fragment.ExcelFragment; import com.hieasy.comm.core.utils.mine.MineDateUtil; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.po…...
RedisDesktopManager(redis客户端,可输入用户名密码)
RedisDesktopManager(redis客户端,可输入用户名密码) Redis桌面管理器(又名RDM) - 是一个用于Windows,Linux和MacOS的快速开源Redis数据库管理应用程序。可以使用url连接或账号密码。 redis设置账号密码后…...
【Adobe After Effects】关于ae点击空格不会播放反而回退一帧的解决方案
最近玩ae的时候遇见了一个小问题,就是有时候敲空格,视频没办法播放,反而会回退一帧,经过摸索发现了一个解决办法: 点击编辑---首选项 然后选择“音频硬件” 然后选择正确的默认输出,点击确定即可...
Linux网络编程:多路I/O转接服务器(select poll epoll)
文章目录: 一:select 1.基础API select函数 思路分析 select优缺点 2.server.c 3.client.c 二:poll 1.基础API poll函数 poll优缺点 read函数返回值 突破1024 文件描述符限制 2.server.c 3.client.c 三:epoll …...
Mybatis系列原理剖析之项目实战:自定义持久层框架
Mybatis系列原理剖析之:项目实战:自定义持久层框架 持久层是JAVA EE三层体系架构中,与数据库进行交互的一层,持久层往往被称为dao层。需要说明的是,持久层的技术选型有很多,绝不仅仅只有mybatis一种。像早…...
阿里云 Serverless 应用引擎 2.0,正式公测!
阿里云 Serverless 应用引擎 SAE2.0 正式公测上线!全面升级后的 SAE2.0 具备极简体验、标准开放、极致弹性三大优势,应用冷启动全面提效,秒级完成创建发布应用,应用成本下降 40% 以上。 此外,阿里云还带来容器服务 Se…...
西北大学计算机考研844高分经验分享
西北大学计算机考研844经验分享 个人介绍 本人是西北大学22级软件工程研究生,考研专业课129分,过去一年里在各大辅导机构任职,辅导考研学生专业课844,辅导总时长达288小时,帮助多名学生专业课高分上岸。 前情回顾…...
【java并发编程的艺术读书笔记】volatile关键字介绍、与synchronized的区别
volatile的简介 volatile是轻量级锁,只用来修饰变量,保证这个变量在多线程下的可见性以及一致性(一个volatile变量被线程修改时会立刻通知其他所有线程),防止指令重排序,但是并不能保证绝对的线程安全 vol…...
LinkedList的顶级理解
目录 1.LinkedList的介绍 LinkedList的结构 2.LinkedList的模拟实现 2.1创建双链表 2.2头插法 2.3尾插法 2.4任意位置插入 2.5查找关键字 2.6链表长度 2.7遍历链表 2.8删除第一次出现关键字为key的节点 2.9删除所有值为key的节点 2.10清空链表 2.11完整代码 3.…...
Illustrator脚本大全:30个免费工具彻底改变你的设计工作流
Illustrator脚本大全:30个免费工具彻底改变你的设计工作流 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 如果你是一名Adobe Illustrator用户,每天重复着相…...
Cursor省钱神器:interactive-feedback-mcp安装配置全攻略(附常见问题排查)
Cursor省钱神器:interactive-feedback-mcp安装配置全攻略(附常见问题排查) 在AI辅助编程领域,Cursor凭借其强大的代码生成和智能补全功能,已成为开发者日常工作的得力助手。然而,许多用户在使用过程中常常…...
企业级二进制差异算法:bsdiff/bspatch的高效智能更新方案
企业级二进制差异算法:bsdiff/bspatch的高效智能更新方案 【免费下载链接】bsdiff bsdiff and bspatch are libraries for building and applying patches to binary files. 项目地址: https://gitcode.com/gh_mirrors/bs/bsdiff 在软件分发和持续部署领域&a…...
从一次数据精度丢失的坑说起:详解Pandas fillna的‘静默下转型’与infer_objects的正确用法
从数据精度陷阱到稳健处理:Pandas类型转换的深度防御实践 1. 当.fillna(0)成为数据分析的隐形杀手 凌晨三点的办公室,咖啡杯早已见底。数据分析师李明盯着屏幕上诡异的报表结果——所有百分比计算结果突然变成了整齐的整数。这个看似简单的数据清洗操作…...
LiuJuan Z-Image Generator真实案例:为独立音乐人生成专辑封面人像全流程
LiuJuan Z-Image Generator真实案例:为独立音乐人生成专辑封面人像全流程 最近,一位独立音乐人朋友找到我,说他想为自己的新专辑设计一个封面。预算有限,请不起专业画师,但又不想要那些千篇一律的模板。他想要一张能体…...
如何用Real-ESRGAN-ncnn-vulkan解决5种常见的图像质量问题?
如何用Real-ESRGAN-ncnn-vulkan解决5种常见的图像质量问题? 【免费下载链接】Real-ESRGAN-ncnn-vulkan NCNN implementation of Real-ESRGAN. Real-ESRGAN aims at developing Practical Algorithms for General Image Restoration. 项目地址: https://gitcode.co…...
零基础快速入门前端DOM 节点操作核心知识点及蓝桥杯 Web 应用开发考点解析(可用于备赛蓝桥杯Web应用开发)
DOM(文档对象模型)是 JavaScript 操作网页内容的核心接口,而节点操作则是 DOM 编程的基础,是蓝桥杯 Web 应用开发赛道的必考核心考点,无论是动态交互效果、数据渲染还是功能实现,都离不开节点的获取、增删、…...
攻克Godot资源提取难题:godot-unpacker工具的创新解法
攻克Godot资源提取难题:godot-unpacker工具的创新解法 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 问题:为什么普通解压工具无法胜任PCK文件提取? Godot引擎打…...
C++ vcpkg:安装、使用、原理与选型
C vcpkg:安装、使用、原理与选型 vcpkg 是微软与社区维护的开源 C/C 包管理器,目标是统一第三方库的获取、构建与集成流程。它支持 Windows / Linux / macOS,并与 CMake、Visual Studio 等工具链深度协作。本文覆盖:是什么、如何…...
CDAN不只是论文里的公式:深入浅出图解‘条件对抗’如何让领域自适应更精准
CDAN不只是论文里的公式:深入浅出图解‘条件对抗’如何让领域自适应更精准 想象你是一位冰淇淋品鉴师,需要将一家老牌店铺(源域)的配方迁移到新店铺(目标域)。传统方法粗暴混合所有原料,导致巧…...
