【算法与数据结构】127、LeetCode单词接龙

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述

二、解法

  思路分析:示例1为例,hit到达cog的路线不止一条,如何找到最短是关键。广度优先搜索是一圈一圈的搜索过程,一旦找到了结果,一定是最短的。本题也只需要最短转换序列的数目而不需要具体的序列,因此不用去关心下图中线是如何连在一起的。因此最终选择广搜,只要差一个字符说明序列之间是连接的。

  • 本题还是一个无向图,需要用到标记位,标记节点是否走过,否则会陷入死循环。为此我们引入一个unordered_map<string, int> visitMap类型的地图,记录word是否被访问过,key值为单词,value为beginWord到该单词的路径长度。
  • 集合是数组类型的,提前转成集合set类型,查找更快。

  根据单词的长度,每次替换其中一个单词,需要用到两个循环,一个循环选择单词中替换的字符位置,另一个用来选择26个字母中的其中一个。然后在单词集合中查找是否存在替换之后的新单词,如果找到将其加入visitMap中。如果新单词是endWord,那么直接放回path+1。path代表路径长度。

在这里插入图片描述

  程序如下

// 127、单词接龙-深度优先搜索
class Solution {
public:
	int ladderLength(string beginWord, string endWord, vector<string>& wordList) {

		unordered_set<string> wordSet(wordList.begin(), wordList.end());	// 转成uset类型,查找更快
		if (wordSet.find(endWord) == wordSet.end()) return 0;	// endWord没有在单词集合中出现,直接返回0
		unordered_map<string, int> visitMap;	// 记录word是否被访问过,key值为单词,value为beginWord到该单词的路径长度

		queue<string> que;		
		visitMap.insert(pair<string, int>(beginWord, 1));
		que.push(beginWord);
		
		while (!que.empty()) {
			string word = que.front();
			que.pop();
			int path = visitMap[word];	// 路径长度
			for (int i = 0; i < word.size(); i++) {
				string newWord = word;		// 用一个新单词替换word,每次置换一个字母
				for (int j = 0; j < 26; j++) {
					newWord[i] = j + 'a';
					if (newWord == endWord) return path + 1;	// 找到end
					if (wordSet.find(newWord) != wordSet.end() && visitMap.find(newWord) == visitMap.end()) {	// newWord出现在wordSet中,且没有访问过
						visitMap.insert(pair<string, int>(newWord, path + 1));
						que.push(newWord);
					}
				}
			}

		}
		return 0;
	}
};

复杂度分析:

  • 时间复杂度: O ( N × C ) O(N \times C) O(N×C),N为wordList长度,C为单词长度。字符串数组转化成umap字符串类型需要 O ( N ) O(N) O(N)。最坏情况下,遍历到wordList最后一个元素才会找到endWord,while循环中的一些操作(如visitMap插入元素和que队列插入、弹出元素复杂度)为 O ( N ) O(N) O(N)。两个for循环的复杂度为 O ( 26 × C ) O(26 \times C) O(26×C)。因此最终的复杂度为 O ( N × C ) O(N \times C) O(N×C)

  • 空间复杂度: O ( N × C ) O(N \times C) O(N×C)

三、完整代码

// 127、单词接龙-深度优先搜索
class Solution {
public:
	int ladderLength(string beginWord, string endWord, vector<string>& wordList) {

		unordered_set<string> wordSet(wordList.begin(), wordList.end());	// 转成uset类型,查找更快
		if (wordSet.find(endWord) == wordSet.end()) return 0;	// endWord没有在单词集合中出现,直接返回0
		unordered_map<string, int> visitMap;	// 记录word是否被访问过,key值为单词,value为beginWord到该单词的路径长度

		queue<string> que;		
		visitMap.insert(pair<string, int>(beginWord, 1));
		que.push(beginWord);
		
		while (!que.empty()) {
			string word = que.front();
			que.pop();
			int path = visitMap[word];	// 路径长度
			for (int i = 0; i < word.size(); i++) {
				string newWord = word;		// 用一个新单词替换word,每次置换一个字母
				for (int j = 0; j < 26; j++) {
					newWord[i] = j + 'a';
					if (newWord == endWord) return path + 1;	// 找到end
					if (wordSet.find(newWord) != wordSet.end() && visitMap.find(newWord) == visitMap.end()) {	// newWord出现在wordSet中,且没有访问过
						visitMap.insert(pair<string, int>(newWord, path + 1));
						que.push(newWord);
					}
				}
			}

		}
		return 0;
	}
};

end

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

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

相关文章

泰迪智能科技大模型数据智能实验室

自2022年11月ChatGPT问世以来&#xff0c;大模型开始备受关注&#xff0c;科技巨头们纷纷推出大模型实验室解决方案。大模型的价值不知在于互联网场景&#xff0c;而在于大模型能力垂直化&#xff0c;能够与具体的业务需求深度融合。 大模型实验室是在学校现有的实验室建设基础…

Mac版本HBuilderX 编辑完浏览器页面不会自动刷新,代码不自动提示

学习uniapp时候发现了个怪异的现象&#xff0c;Hbuilder里的项目&#xff0c;代码不自动提示&#xff0c;而且&#xff0c;编译完vue文件之后&#xff0c;浏览器不自动刷新。 排查问题&#xff1a; 1:项目层级不对 &#xff0c;编译时候层级过深 2:一些配置信息&#xff1b; …

c++ qt五子棋联网对战游戏

C qt 五子棋联网对战游戏运行环境 Qt 6.6.0 (MSVC 2019 64-bit) 代码文件编码格式 ANSI txt文件编码格式 ANSI 测试用例 服务端端口被占用 通过客户端端口被占用 通过客户端连接服务端 服务端中途断开 通过客户端连接服务端 客户端中途断开 通过服务端没有启动 客户端启动…

petalinux_zynq7 驱动DAC以及ADC模块之五:nodejs+vue3实现web网页波形显示

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

MySQL数据库调优之 explain的学习

性能分析工具的使用 在数据库调优中&#xff0c;目标就是响应时间更快&#xff0c;吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮助快速找到调优的思路与方式。 1.数据库服务器的优化步骤 整个流程分为观察(Show status)和行动(Action) 两个部分。字母S的部分代表观察…

RabbitMQ学习整理————基于RabbitMQ实现RPC

基于RabbitMQ实现RPC 前言什么是RPCRabbitMQ如何实现RPCRPC简单示例通过Spring AMQP实现RPC 前言 这边参考了RabbitMQ的官网&#xff0c;想整理一篇关于RabbitMQ实现RPC调用的博客&#xff0c;打算把两种实现RPC调用的都整理一下&#xff0c;一个是使用官方提供的一个Java cli…

C++【继承】

继承 继承的概念 继承是面向对象语言得三大特性之一&#xff08;继承、封装、多态&#xff09;&#xff0c;注&#xff1a;继承并不是C的特性&#xff0c;是面向对象语言的特性。 继承的概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段…

U盘故障频发?了解原因,掌握正确使用方法!

U盘文件夹变打不开的文件是一种常见的故障&#xff0c;表现为用户无法访问存储在U盘中的文件或文件夹。这种故障通常是由于各种原因引起的&#xff0c;包括物理损坏、文件系统错误、病毒感染等。当遇到这种情况时&#xff0c;用户需要采取一些方法来恢复文件。 U盘故障频发&…

CentOS使用Docker搭建Halo网站并实现无公网ip远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

【前端素材】推荐优质后台管理系统Protable平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作&#xff0c;用于管理网站内容、用户权限、数据分析等。当我们从多个层次来详细分析后台管理系统时&#xff0c;可以将其功能和定义进一步细分&#xff0c;…

微信小程序 --- wx.request网络请求封装

网络请求封装 网络请求模块难度较大&#xff0c;如果学习起来感觉吃力&#xff0c;可以直接学习 [请求封装-使用 npm 包发送请求] 以后的模块 01. 为什么要封装 wx.request 小程序大多数 API 都是异步 API&#xff0c;如 wx.request()&#xff0c;wx.login() 等。这类 API 接口…

crmeb多门店商城系统二次开发 增加车辆车牌搜索功能、车辆公里数

1、增加的数据库 ALTER TABLE eb_store_order ADD cart_number VARCHAR(255) NOT NULL DEFAULT COMMENT 车牌 AFTER erp_order_id, ADD curmileage VARCHAR(255) NOT NULL DEFAULT COMMENT 当前里程 AFTER cart_number; ALTER TABLE eb_store_cart ADD cart_number VARCHAR(…

go使用trpc案例

1.go下载trpc go install trpc.group/trpc-go/trpc-cmdline/trpclatest 有报错的话尝试配置一些代理&#xff08;选一个&#xff09; go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPROXYhttps://goproxy.io,direct go env -w GOPROXYhttps://goproxy.baidu.com/…

【机器学习的主要任务和应用领域】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱 简述概要 了解机器学习的主要任务和应用领域 知识图谱 机器学习的主要任务可以分为监督学习、无监督学习和半监督学习。 监督学习&#xff1a;这是机器学习中最为常见的一类任务&#xff0c;基于已知类…

如何设置离线启动NVIDIA Chat with RTX

第一步 先上图C:\Users\test\AppData\Local\NVIDIA\ChatWithRTX\RAG\trt-llm-rag-windows-main\ui 默认安装的地址 用户名可能会有差异&#xff0c;需要注意下 增加如图中深色的地方 shareTrue, 第二步 科学上网 把下面的都下载下来 保存到自己的磁盘中 修改路径 如下图 如…

对Redis锁延期的一些讨论与思考

上一篇文章提到使用针对不同的业务场景如何合理使用Redis分布式锁&#xff0c;并引入了一个新的问题 若定义锁的过期时间是10s&#xff0c;此时A线程获取了锁然后执行业务代码&#xff0c;但是业务代码消耗时间花费了15s。这就会导致A线程还没有执行完业务代码&#xff0c;A线程…

2024年【起重机司机(限桥式起重机)】找解析及起重机司机(限桥式起重机)考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【起重机司机(限桥式起重机)】找解析及起重机司机(限桥式起重机)考试总结&#xff0c;包含起重机司机(限桥式起重机)找解析答案和解析及起重机司机(限桥式起重机)考试总结练习。安全生产模拟考试一点通结合国家…

游戏平台如何定制开发?

随着科技的飞速发展和互联网的普及&#xff0c;游戏平台已成为人们休闲娱乐的重要选择。为了满足用户多样化的需求&#xff0c;游戏平台的定制开发显得尤为重要。本文将探讨游戏平台定制开发的过程、关键要素以及注意事项&#xff0c;为有志于涉足此领域的开发者提供参考。 一、…

springboot自定义starter,实现自动装配

1、SpringBoot Starter介绍 随着Spring的日渐臃肿&#xff0c;为了简化配置、开箱即用、快速集成&#xff0c;Spring Boot 横空出世。 目前已经成为 Java 目前最火热的框架了。平常我们用Spring Boot开发web应用。Spring mvc 默认使用tomcat servlet容器&#xff0c; 因为Sprin…