力扣_字符串9—单词接龙I、II

题目

按字典 w o r d L i s t wordList wordList 完成从单词 b e g i n W o r d beginWord beginWord 到单词 e n d W o r d endWord endWord 转化,一个表示此过程的 转换序列 是形式上像 b e g i n W o r d − > s 1 − > s 2 − > . . . − > s k beginWord -> s1 -> s2 -> ... -> sk beginWord>s1>s2>...>sk 这样的单词序列,并满足:

  • 每对相邻的单词之间仅有单个字母不同。
  • 转换过程中的每个单词 s i ( 1 < = i < = k ) si(1 <= i <= k) si(1<=i<=k)必须是字典 w o r d L i s t wordList wordList 中的单词。注意, b e g i n W o r d beginWord beginWord 不必是字典 w o r d L i s t wordList wordList 中的单词。
  • s k = = e n d W o r d sk == endWord sk==endWord
  • 给你两个单词 b e g i n W o r d beginWord beginWord e n d W o r d endWord endWord ,以及一个字典 w o r d L i s t wordList wordList 。请你找出并返回所有从 b e g i n W o r d beginWord beginWord e n d W o r d endWord endWord 的 最短转换序列 ,如果不存在这样的转换序列,返回一个空列表。每个序列都应该以单词列表 [ b e g i n W o r d , s 1 , s 2 , . . . , s k ] [beginWord, s1, s2, ..., sk] [beginWord,s1,s2,...,sk] 的形式返回。

示例:

  • 输入: b e g i n W o r d = " h i t " , e n d W o r d = " c o g " , w o r d L i s t = [ " h o t " , " d o t " , " d o g " , " l o t " , " l o g " , " c o g " ] beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"] beginWord="hit",endWord="cog",wordList=["hot","dot","dog","lot","log","cog"]
  • 输出: [ [ " h i t " , " h o t " , " d o t " , " d o g " , " c o g " ] , [ " h i t " , " h o t " , " l o t " , " l o g " , " c o g " ] ] [["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]] [["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]]
  • 解释:存在 2 2 2 种最短的转换序列:
    " h i t " − > " h o t " − > " d o t " − > " d o g " − > " c o g " "hit" -> "hot" -> "dot" -> "dog" -> "cog" "hit">"hot">"dot">"dog">"cog"
    " h i t " − > " h o t " − > " l o t " − > " l o g " − > " c o g " "hit" -> "hot" -> "lot" -> "log" -> "cog" "hit">"hot">"lot">"log">"cog"

方法

  • 广度优先
    • 我们可以把每个单词都抽象为一个点,如果两个单词可以只改变一个字母进行转换,那么说明他们之间有一条双向边。因此我们只需要把满足转换条件的点相连,就形成了一张图。
    • 基于该图,我们以 b e g i n W o r d beginWord beginWord 为图的起点,以 e n d W o r d endWord endWord 为终点进行广度优先搜索,寻找 b e g i n W o r d beginWord beginWord e n d W o r d endWord endWord 的最短路径。
    • 建图:依据朴素的思路,我们可以枚举每一对单词的组合,判断它们是否恰好相差一个字符,以判断这两个单词对应的节点是否能够相连。但是这样效率太低,我们可以优化建图。
      • 具体地,我们可以创建虚拟节点。例如对于单词 hit,我们创建三个虚拟节点 *it、h*t、hi*,并让 hit 向这三个虚拟节点分别连一条边即可。如果一个单词能够转化为 hit,那么该单词必然会连接到这三个虚拟节点之一。对于每一个单词,我们枚举它连接到的虚拟节点,把该单词对应的 id 与这些虚拟节点对应的 id 相连即可。
    • 最后我们将起点加入队列开始广度优先搜索,当搜索到终点时,我们就找到了最短路径的长度。注意因为添加了虚拟节点,所以我们得到的距离为实际最短路径长度的两倍。同时我们并未计算起点对答案的贡献,所以我们应当返回距离的一半再加一的结果。
    • 因为要返回转换序列,所以每次搜索时要将 每个单词是从哪些单词扩展而来 记录下来(代码中的 f r o m from from),最后回溯得到最短路径

代码

class Solution {
public:int id = 0;vector<vector<int>> graph;map<string, int> maps;map<int, string> maps1;bool add_node(string& word){if(maps.find(word) == maps.end()){maps[word] = id;maps1[id] = word;id++;graph.emplace_back();return true;}elsereturn false;}void add_edge(string& word){if(add_node(word)){int id2 = maps[word];for(int i = 0; i < word.size(); i++){string temp = word;temp[i] = '*';add_node(temp);int id1 = maps[temp];graph[id1].push_back(id2);graph[id2].push_back(id1);}}}void backtrack(vector<vector<string>> &res, const string &Node, unordered_map<string, set<string>> &from,vector<string> &path) {if (from[Node].empty()) {res.push_back({path.rbegin(), path.rend()});return;}for (const string &Parent: from[Node]) {if(Parent.find('*') == string::npos)path.push_back(Parent);backtrack(res, Parent, from, path);if(Parent.find('*') == string::npos)path.pop_back();}}// int ladderLength(string beginWord, string endWord, vector<string>& wordList) {vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {vector<vector<string>> res;for(int i = 0; i < wordList.size(); i++){add_edge(wordList[i]);}add_edge(beginWord);if(maps.find(endWord) == maps.end())return res;queue<int> que;que.push(maps[beginWord]);vector<int> dis(id, INT_MAX);dis[maps[beginWord]] = 0;unordered_map<string, set<string>> from = {{beginWord, {}}};bool found = false;while(!que.empty()){int id_temp = que.front();que.pop();if(id_temp == maps[endWord]){// return dis[id_temp]/2+1;found = true;break;}for(int i = 0; i < graph[id_temp].size(); i++){// 不懂就手写一遍广度优先的流程if(dis[graph[id_temp][i]] == INT_MAX){from[maps1[graph[id_temp][i]]].insert(maps1[id_temp]);que.push(graph[id_temp][i]);dis[graph[id_temp][i]] = dis[id_temp] + 1;}else if(dis[id_temp]+1 == dis[graph[id_temp][i]]){from[maps1[graph[id_temp][i]]].insert(maps1[id_temp]);}}}if (found) {vector<string> Path = {endWord};backtrack(res, endWord, from, Path);}return res;}
};

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

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

相关文章

java 泛型----T、?的使用

java中T表示泛型。&#xff1f;表示不确定的类型。 jdk使用K表示键&#xff0c;V表示值&#xff0c;T表示type类型,E表示enum枚举。这四个符号只是表示泛型名称&#xff0c;可以换成其他字母&#xff0c;但是需要在之前声明。 参考文章&#xff1a;java泛型&#xff1a;T与?的…

问题:人的安全知识和技能是天生的。() #媒体#知识分享#学习方法

问题&#xff1a;人的安全知识和技能是天生的。&#xff08;) 人的安全知识和技能是天生的。() 参考答案如图所示 问题&#xff1a;&#xff08;&#xff09;是党和国家的根本所在、命脉所在&#xff0c;是全国各族人民的利益所在、幸福所在。 A.人民当家作主 B.坚持和完善…

QT+OSG/osgEarth编译之八十七:osgdb_p3d+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_p3d)

文章目录 一、osgdb_p3d介绍二、文件分析三、pro文件四、编译实践一、osgdb_p3d介绍 P3DXML是Panda3D引擎中使用的一种文件格式,用于描述3D场景的层次结构和属性。它是一种基于XML(eXtensible Markup Language)的文本格式,可以被Panda3D引擎读取和解析。 P3DXML文件包含了…

OpenAI突然发布首款文生视频模型——Sora;谷歌发布Gemini 1.5,迈向多模态大模型新时代

&#x1f989; AI新闻 &#x1f680; OpenAI突然发布首款文生视频模型——Sora 摘要&#xff1a;OpenAI发布了首个AI视频模型Sora&#xff0c;可以根据文字指令生成神级效果的长视频&#xff0c;引发了广泛关注和震惊。 Sora模型通过深入理解语言和图像&#xff0c;能够创造出…

代码随想录算法训练营第二十七天|贪心算法理论基础,455.分发饼干,376. 摆动序列,53. 最大子序和

系列文章目录 代码随想录算法训练营第一天|数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

中国电子学会2023年12月份青少年软件编程Scratch图形化等级考试试卷三级真题(含答案)

2023-12 Scratch三级真题 分数&#xff1a;100 题数&#xff1a;31 测试时长&#xff1a;60min 一、单选题(共18题&#xff0c;共50分) 1.运行左图程序&#xff0c;想得到右图中的效果&#xff0c;红色框应填写的数值是&#xff1f;&#xff08;D&#xff09;(3分) A.12 …

《合成孔径雷达成像算法与实现》Figure6.18

% rho_r c/(2*Fr)而不是rho_r c/(2*Bw) % Hsrcf exp函数里忘记乘pi了 clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; …

【题解】—— LeetCode一周小结6

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结5 5.跳跃游戏 VI 题目链接&#xff1a;1696. 跳跃游戏 VI 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一开始你在下标 0 处。每一步&#xff0c;你最多可以往前跳 k 步&#xff0c;…

蓝桥杯电子类单片机提升三——NE555

目录 单片机资源数据包_2023 一、NE555和定时器工作模式 1.NE555的介绍 2.定时器的计数模式 二、NE555频率读取代码的实现 1.定时器0初始化 2.通过读取TH0和TL0来读取频率 3.通过中断读取频率 三、完整代码演示 通过读取TH0和TL0来读取频率 main.c 通过中断读取频…

26.执行上下文/作用域链/闭包

1. 对闭包的理解 闭包是指有权访问另一个函数作用域中变量的函数&#xff0c;创建闭包的最常见的方式就是在一个函数内创建另一个函数&#xff0c;创建的函数可以访问到当前函数的局部变量。 闭包有两个常用的用途&#xff1b; 闭包的第一个用途是使我们在函数外部能够访问到…

云数据中心网络架构与技术

第2章 认识云数据中心网络 云数据中心是一种基于云计算架构的新型数据中心&#xff0c;其计算、存储及网络资源松耦合&#xff0c;各种IT设备完全虚拟化&#xff0c;模块化程度、自动化程度、绿色节能程度均较高。云数据中心网络的特点&#xff0c;首先是高度的虚拟化&#x…

qml中解决Page控件头部元素Margin不生效的问题

0、想要的效果 1、问题描述 经测试&#xff1a;Page的头部无法完美的进行左右边距设置&#xff0c;leftMargin可以&#xff0c;rightMargin不可以。。。。 Page {// ...header: Frame {id: headerheight: 70// 必须首先锚定位&#xff0c;然后设置边距才生效padding: 0anchor…

QlikSense: 通过 Insight Advisor 创建可视化

通过 Insight Advisor 创建可视化 探索你的数据&#xff0c;并通过 Insight Advisor 分析类型 和 Insight Advisor 搜索创建可视化。Insight Advisor 使用 Qlik cognitive engine 和应用程序的逻辑模型为您创建可视化。单击工作表中的 Insight Advisor 以使用 Insight Advisor…

LeetCode 31天

455. 分发饼干 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {// 先排序sort(g.begin(), g.end());sort(s.begin(), s.end());int i 0;int j 0;while (i < g.size() && j < s.size()) {if (s[j] &g…

构建智慧交通平台:架构设计与实现

随着城市交通的不断发展和智能化技术的迅速进步&#xff0c;智慧交通平台作为提升城市交通管理效率和水平的重要手段备受关注。本文将探讨如何设计和实现智慧交通平台的系统架构&#xff0c;以应对日益增长的城市交通需求&#xff0c;并提高交通管理的智能化水平。 ### 1. 智慧…

【电路笔记】-LR串联电路

LR串联电路 文章目录 LR串联电路1、概述2、示例1所有线圈、电感器、扼流圈和变压器都会在其周围产生磁场,由电感与电阻串联组成,形成 LR 串联电路。 1、概述 在本节有关电感器的第一个文章中,我们简要介绍了电感器的时间常数,指出流过电感器的电流不会瞬时变化,而是会以恒…

B3659 [语言月赛202209] 课程QQ群

题目描述 报名洛谷网校课程的学员可以得到加入课程 QQ 群的验证码。 某期课程设定的验证码为数字 k&#xff0c;现在一共有 n 个人申请加入 QQ 群&#xff0c;第 i 个人提供的验证码为 ai​。 现在请你担任课程 QQ 群的管理员&#xff0c;请问你一共应该通过多少人的入群申请…

Covalent Network(CQT)与卡尔加里大学建立合作,共同推动区块链技术创新

Covalent Network&#xff08;CQT&#xff09;作为领先的 Web3 数据索引器和提供者&#xff0c;宣布已经与卡尔加里大学达成了具备开创性意义的合作&#xff0c;此次合作标志着推动区块链数据研究和可访问性的重要里程碑。卡尔加里大学是首个以验证者的身份加入 Covalent Netwo…

Vue源码系列讲解——模板编译篇【四】(文本解析器)

1. 前言 在上篇文章中我们说了&#xff0c;当HTML解析器解析到文本内容时会调用4个钩子函数中的chars函数来创建文本型的AST节点&#xff0c;并且也说了在chars函数中会根据文本内容是否包含变量再细分为创建含有变量的AST节点和不包含变量的AST节点&#xff0c;如下&#xff…

如何在30天内使用python制作一个卡牌游戏

如何在30天内使用python制作一个卡牌游戏 第1-5天&#xff1a;规划和设计第6-10天&#xff1a;搭建游戏框架第11-20天&#xff1a;核心游戏机制开发第21-25天&#xff1a;游戏界面和用户体验第26-30天&#xff1a;测试和发布附加建议游戏类型游戏规则设计界面设计技术选型第6-…