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

Leetcode 每日一题:Word Ladder

写在前面:

今天我们来看一道图论的题,这道题目是我做过目前最难与图论联想到的一道题目之一。如果没有提示的话,我们很容易往 dp 等解决 array 问题的方向去解决它,经过我超过 2个小时的思考我觉得这种方向是没前途的~~ 那今天就让我们一起来看下这道看起来不像是图论的题,我们怎么样巧妙的把它转化为图论中找最小路径的问题并利用 BFS 等经典算法将它解决!

题目介绍:

题目信息:

  • 题目链接:https://leetcode.com/problems/word-ladder/description/
  • 题目类型:Graph,BFS
  • 题目难度:Hard
  • 题目来源:Google 高频面试真题

题目问题:

  • 给定一个字符串数列,一个 BeginWord,一个EndWord
  • 要求从 BeginWord 开始,每次只改变一个字母并且改变后的单词需要在 字符串序列中
  • 如果能以这样的方式一步步的将 BeginWord 变成 Endword,则求出最少需要几次变化
  • 如果无法完成则返回 0
  • 例子:

题目想法:

如何利用只变一个字母的特性:

这道题目的题眼就在于每次只能变化一个字母,并且这个变化的规则是必须按着给定字符串里有的 string 进行变化才可以。同时,他又给定了一个 beginWord 和 一个 endWord,要求通过一次次变化之后,能将 beginWord 变成 endWord

如果将字符串数组里的每一个 “中间字符串” 想象成一个个中间节点,beginWord想成起点,endWord想成终点,他们之间如果只是相差一个字母,则有路径链接,这道题目看起来像什么呢? --- 没错!就是走迷宫类似的图论问题! 

图论构造:

有了这个思路,我们尝试用可视化的方法把这道题转化为图论问题。我们有一个起点和一个终点节点,每一个给定的 字符串数列元素 都是一个中间节点,并且起点,终点,中间节点直接,如果两个单词只差一个字母,则他们俩是 “邻居”,并且可以互相访问,可构造的抽象图如下:

Adjacent List 构造:

解决图论问题最关键的算法结构就是 adjacent List 的构造,这关系到我们在遍历图的时候如何前进。这道题目的 adjacent 关系就来源于我们的 “只能变化一个字母”

举例:

hot ----> hat   他们只有中间一个字母变化了,所以他们的单词结构都是 “h * t"

dog -----> log 他们同样有相同的单词结构 “ * og”

我们可以看出,对于一个单词,他的每一个字母替换成 *, 都能形成一种 semantic,也就是单词结构,而如果我们根据相同的单词结构,就能随意的在这些单词之间进行切换:

所以我们的 Adjacent List 的结构为:

<string, vector<string>>:    <semantic, vector<string that have this semantic>>

BFS

当我们将 adjacent List 构造出来以后,我们的图形就完成了。接下来,根据题目特性要寻找最短路径,同时每一条路径都是 unweighted 的,同时要避免出现重复,我们选择 BFS 算法来进行遍历

题目解法:

  • 创建 semantic 字典
  • 遍历所有 给定中间 字符串
    • 根据每个字符串的每一个 semantic进行遍历插入
  • 创建 visited 字典避免重复
  • 标准 BFS 解决 beginWord 到 endWord 的最短路径问题
    • 创建的 queue 要带上(当前字符串,当前消耗次数)
    • 如果这次 iterate 能成功,返回 消耗次数 +1
    • 如果失败,且未曾访问过,(新字符串,消耗次数 + 1)入队
  • 返回 0, BFS 失败没有结果

题目代码:

class Solution {
public:unordered_map<string, vector<string>> dictStringFormat;unordered_map<string, bool> visited;//BFS to find the answer, return the shortest level we need or 0 if no solutions. int BFSRes(string beginWord, string endWord, vector<string>& wordList){queue<pair<string, int>> q;q.push({beginWord, 1});while(!q.empty()){string currentWord = q.front().first;int currentLevel = q.front().second;q.pop();for(int i = 0; i < currentWord.size(); i++){string semantic = currentWord.substr(0, i) + "*" + currentWord.substr(i+1);for(string similarString: dictStringFormat[semantic]){//if we found the stringif(similarString == endWord){return currentLevel + 1;}//else, determine whether enqueue or not:if(!visited.contains(similarString)){visited[similarString] = true;q.push({similarString, currentLevel + 1});}}}}return 0;}int ladderLength(string beginWord, string endWord, vector<string>& wordList) {int stringLen = beginWord.size();//make a connection for each string with one semantic:for(string word: wordList){for(int i = 0; i < stringLen; i++){string word_semantic = word.substr(0, i) + "*" + word.substr(i+1);dictStringFormat[word_semantic].push_back(word);}}//Perform BFS from start to find the shortest path to the end: return BFSRes(beginWord, endWord, wordList);}
};
  • Runtime:O(M^2 + N) M 是每一个字符串的长度,N是中间节点字符串的个数
  • Space:O(M^2 + N) M是每一个字符串的长度,因为我们对每一个字符串都存储了与他长度相等多的 semantic,就是 M*M。同时,我们在 visited 和 queue 中存储了 N 个 中间节点

相关文章:

Leetcode 每日一题:Word Ladder

写在前面&#xff1a; 今天我们来看一道图论的题&#xff0c;这道题目是我做过目前最难与图论联想到的一道题目之一。如果没有提示的话&#xff0c;我们很容易往 dp 等解决 array 问题的方向去解决它&#xff0c;经过我超过 2个小时的思考我觉得这种方向是没前途的&#xff5e…...

c++ 编辑器 和 编译器 的详细解释

在 C 开发中&#xff0c;编辑器 和 编译器 是两个不同的工具&#xff0c;分别在编写代码和生成可执行文件的过程中起着不同的作用。下面是它们的详细介绍&#xff1a; 1. 编辑器&#xff08;Editor&#xff09; 编辑器 是用来编写和编辑代码的工具。C 代码就是通过编辑器编写…...

计算机视觉(二)—— MDPI特刊推荐

特刊征稿 01 期刊名称&#xff1a; Applied Computer Vision and Pattern Recognition: 2nd Volume 截止时间&#xff1a; 摘要提交截止日期&#xff1a;2024年10月30日 投稿截止日期&#xff1a;2024年12月30日 目标及范围&#xff1a; 包括但不限于以下领域&#xff1a…...

交叉编译工具链的安装及带wiringPi库的交叉编译实现

交叉编译工具链的安装及带wiringPi库的交叉编译实现 交叉编译的概念交叉编译工具链的安装下载交叉编译工具链配置环境遍变量编译程序到ARM平台 带wiringPi库的交叉编译下载编译wiringPi库调用树莓派的wringPi库 交叉编译的概念 交叉编译是在一个平台上生成另一个平台上的可执行…...

java: 程序包org.junit.jupiter.api不存在

明明idea没有报错&#xff0c;引用包也没问题&#xff0c;为啥提示java: 程序包org.junit.jupiter.api不存在&#xff1f; 配置&#xff01;还TMD是配置&#xff01; 如果是引用包的版本不对或者其他&#xff0c;直接就是引用报错或者pom里面飘红了。 这个应该是把generat…...

代码随想录刷题day32丨动态规划理论基础,509. 斐波那契数, 70. 爬楼梯, 746. 使用最小花费爬楼梯

代码随想录刷题day32丨动态规划理论基础&#xff0c;509. 斐波那契数&#xff0c; 70. 爬楼梯&#xff0c; 746. 使用最小花费爬楼梯 1.动态规划理论基础 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题…...

为什么矩阵特征值之和等于主对角线元素之和,特征值乘积等于行列式值

首先给出特征值和特征向量的定义。 设A是n阶矩阵&#xff0c;如果数λ和n维非零向量x使关系式 Axλx &#xff08;1&#xff09; 成…...

学生学籍管理系统可行性分析报告

引言 一、编写目的 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。而学籍管理系统软件&#xff0c;可广泛应用于全日制大、中小学及其他各类学校&#xff0c;系统涵盖了小学、初中、高中学籍…...

C#排序算法新境界:深度剖析与高效实现基数排序

基数排序&#xff08;Radix Sort&#xff09;是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数进行比较。具体来说&#xff0c;基数排序有两种方法&#xff1a; 最低位优先&#xff08;LSD, Least Significant Digit f…...

玩机搞机-----如何简单的使用ADB指令来卸载和冻结系统应用 无需root权限 详细操作图示教程

同类博文&#xff1a; 玩机搞机---卸载内置软件 无root权限卸载不需要的软件 安全卸载_无需root卸载彻底内置软件-CSDN博客 在很多时候我们需要卸载一些系统级的app。但如果直接手机端进行卸载的话。是无法正常卸载的。其实我们可以通过有些成品工具或者完全靠ADB指令来进行卸…...

如何通过 Apache Camel 将数据导入 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz 使用 Apache Camel 将数据提取到 Elasticsearch 的过程将搜索引擎的稳健性与集成框架的灵活性相结合。在本文中&#xff0c;我们将探讨 Apache Camel 如何简化和优化将数据提取到 Elasticsearch。为了说明此功能&#xff0c;我们将实…...

打造民国风格炫酷个人网页:用HTML和CSS3传递民国风韵

附源码&#xff01;&#xff01;&#xff01; 感谢支持 小弟不断创作网站demo感兴趣的可以关注支持一下 对了 俺在结尾带上了自己用的 背景 大家可以尝试换一下效果更好哦~~~ 如何创建一个民国风格的炫酷网页 在这篇博客中&#xff0c;我们将展示如何制作一个结合民国风格和…...

豆包MarsCode编程助手:产品功能解析与应用场景探索!

随着现代技术的不断进化升级&#xff0c;人工智能正在逐步改变着我们的日常工作方式。特别是对于复杂的项目&#xff0c;代码编写、优化、调试、测试等环节充满挑战。为了简化这些环节、提高开发效率&#xff0c;许多智能编程工具应运而生&#xff0c;豆包MarsCode 编程助手就是…...

爬虫全网抓取

爬虫全网抓取是指利用网络爬虫技术&#xff0c;通过自动化的方式遍历互联网上各个网站、论坛、博客等&#xff0c;从这些网页中提取所需的数据。它通常涉及以下几个步骤&#xff1a; 目标设定&#xff1a;确定要抓取哪些类型的网页内容&#xff0c;比如新闻、商品信息、用户评论…...

【计算机组成原理】详细解读带符号整数在计算机中的运算

有符号整数的运算 导读一、补码的优势二、补码的加法运算三、补码的减法运算四、原码、反码、补码的特性结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 经过前面的介绍&#xff0c;我们已经初步认识了有符号整数的三种表示形式&…...

vue3常见的bug 修复bug

Vue 3 作为 Vue.js 的最新版本&#xff0c;在性能、开发体验以及代码可维护性等方面带来了显著的提升。然而&#xff0c;就像任何软件框架一样&#xff0c;Vue 3 在使用过程中也可能遇到一些典型的bug或问题。以下是一些可能遇到的典型问题&#xff1a; 响应式系统相关的问题&…...

C++课程笔记 类和对象

类概念 结构体&#xff1a;只要属性 类&#xff1a;有属性也有方法 c可以省略struct c不行 #include<iostream> using namespace std;typedef struct queue1 {int a;queue1 q() {queue1 q(2);return q;};queue1(){}queue1(int qa){a qa;} }q1; int main() {queue1 Q1;…...

提问即创作:用Prompt提示词引领AI灵感爆发

文章目录 &#x1f34a;AI内容创作的精髓&#xff1a;提示词Prompt1 什么是提示词工程?1.1 提示词是如何影响AI的输出结果?1.2 提示词的原理是什么1.3 提示词工程师的前景1.4 谁能成为提示词工程师&#xff1f;1.5 提示词的未来前景 2 提示词的基本书写技巧3 常见的提示词框架…...

一码空传临时网盘PHP源码,支持提取码功能

源码介绍 一码空传临时网盘源码V2.0免费授权&#xff0c;该源码提供了一个简单易用的无数据库版临时网盘解决方案。前端采用了layui开发框架&#xff0c;后端使用原生PHP编写&#xff0c;没有引入任何开发框架&#xff0c;保持了代码的简洁和高效。 这个程序使用了一个无数据…...

自然语言处理实战项目

自然语言处理实战项目 自然语言处理&#xff08;NLP, Natural Language Processing&#xff09;是人工智能的重要分支之一&#xff0c;致力于让计算机理解、生成并与人类进行语言交互。随着深度学习、神经网络和大数据的发展&#xff0c;NLP技术在近年来取得了飞跃性的进展&am…...

Cogito-v1-preview-llama-3B效果展示:STEM题目分步推导+代码生成真实截图

Cogito-v1-preview-llama-3B效果展示&#xff1a;STEM题目分步推导代码生成真实截图 1. 模型能力概览 Cogito v1 预览版是Deep Cogito推出的混合推理模型系列&#xff0c;在大多数标准基准测试中均超越了同等规模下最优的开源模型。这个3B参数的模型在编码、STEM题目解答、指…...

PySR社区贡献指南:如何参与这个革命性符号回归开源项目的开发

PySR社区贡献指南&#xff1a;如何参与这个革命性符号回归开源项目的开发 【免费下载链接】PySR High-Performance Symbolic Regression in Python and Julia 项目地址: https://gitcode.com/gh_mirrors/py/PySR 想要为高性能符号回归工具PySR做出贡献吗&#xff1f;这份…...

搞懂 SAP Fiori 前端服务器授权模型:从看得见应用,到真正拿到数据

在很多 SAP 项目里,权限问题最容易制造一种很迷惑的现象:用户明明已经拿到了角色,却还是打不开应用;或者磁贴已经能看见了,点进去却报错;再或者应用能启动,却一条业务数据都读不出来。要把这类问题讲清楚,关键不在于死记事务码,而在于真正理解 SAP Fiori 的授权是如何…...

极客专属:OpenClaw+百川2-13B打造个人CLI智能助手

极客专属&#xff1a;OpenClaw百川2-13B打造个人CLI智能助手 1. 为什么开发者需要命令行智能助手 作为一个长期与终端打交道的开发者&#xff0c;我每天要重复执行大量机械操作&#xff1a;查看日志、运行测试、整理结果。这些工作虽然简单&#xff0c;却极其消耗精力。直到我…...

Stable Diffusion ComfyUI进阶:局部重绘与智能扩图的实战技巧与创意应用

1. 局部重绘的核心原理与实战技巧 局部重绘是Stable Diffusion ComfyUI中最实用的功能之一&#xff0c;它允许你在不改变整体构图的情况下&#xff0c;对图像的特定区域进行重新绘制。这个功能背后的技术原理其实很有意思——它利用了潜在空间&#xff08;latent space&#xf…...

腾讯游戏卡顿终极解决方案:ACE-Guard资源限制器完整指南

腾讯游戏卡顿终极解决方案&#xff1a;ACE-Guard资源限制器完整指南 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源&#xff0c;支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 你是否在玩《地下城与勇士》、《英雄…...

工业视觉代码交付总被退回?(甲方验收必查的6项硬性指标:实时性≤35ms、重复精度±0.015px、抗电磁干扰日志完备性)

第一章&#xff1a;工业视觉代码交付失败的典型归因分析工业视觉系统在产线部署阶段频繁遭遇代码交付失败&#xff0c;其根本原因往往并非算法性能不足&#xff0c;而是工程化落地环节存在系统性疏漏。以下从环境适配、数据闭环、接口契约三个维度展开典型归因。运行时环境不一…...

RTC成语音AI基础设施:AWS和ElevenLabs相继跟进,ZEGO已跑三年

2026 年 3 月&#xff0c;语音 AI 领域迎来一个值得关注的技术信号&#xff1a;AWS&#xff08;亚马逊云科技&#xff09;与 ElevenLabs 在同一个月内相继宣布支持 WebRTC 协议。这一时间上的高度吻合&#xff0c;折射出行业对实时语音交互底层架构的共同判断&#xff1a;传统 …...

咱们今天来唠唠机器人轨迹规划那点事儿。不少小伙伴在玩机械臂的时候总会遇到关节空间和笛卡尔空间轨迹规划的抉择困难症,这俩货到底有什么区别?直接上硬核代码

matlab笛卡尔空间和关节空间轨迹规划 关节空间机器臂多项式轨迹规划定做&#xff0c;353和333多项式轨迹规划和优化关节空间规划有个大杀器——多项式插值。比如要让机械臂从A点平滑运动到B点&#xff0c;咱们可以玩三次多项式&#xff08;3-3-3&#xff09;或者五次多项式&…...

给汽车ECU做“体检报告”:手把手解读Basetech OCC计数器里的5个关键指标

给汽车ECU做“体检报告”&#xff1a;手把手解读Basetech OCC计数器里的5个关键指标 当一辆车亮起故障灯开进维修车间&#xff0c;维修技师的第一反应往往是连接诊断仪读取数据。但面对屏幕上密密麻麻的OCC计数器数值&#xff0c;很多新手会感到无从下手——这些数字到底在说什…...