Golang | Leetcode Golang题解之第126题单词接龙II

题目:

题解:

//bfs+dfs(如果是双向bfs,效果会更好)
func findLadders(beginWord string, endWord string, wordList []string) [][]string {//字典表(将wordList中的单词放入hash表中,方便查找)dict:=make(map[string]bool,0)for _,v:=range wordList{dict[v]=true}//如果endWord不在hash表中,表示不存在转换列表,返回空集合if !dict[endWord]{return [][]string{}}//将第一个单词放入hash表中,方便实现邻接表(构建图)dict[beginWord]=true//构建邻接表graph:=make(map[string][]string,0)//执行bfs搜索,找到每个点到endWord的距离distance:=bfs(endWord,dict,graph)res:=make([][]string,0)//保存结果//执行dfs操作dfs(beginWord,endWord,&res,[]string{},distance,graph)return res
}//回溯实现方式一:(个人偏好这个,更符合模板)
func dfs(beginWord string,endWord string,res *[][]string,path []string,distance map[string]int,graph map[string][]string){//出递归条件if beginWord==endWord{path=append(path,beginWord) //加入endWord节点tmp:=make([]string,len(path))copy(tmp,path)(*res)=append((*res),tmp)path=path[:len(path)-1] //移除endWord节点return}//否则遍历图for _,v:=range graph[beginWord]{//遍历图时,朝着距离与终点越来越近的方向进行(当前节点的距离肯定要比下一个距离大1)if distance[beginWord]==distance[v]+1{path=append(path,beginWord)dfs(v,endWord,res,path,distance,graph)//回溯(执行完上述的所有时,将其回溯回去)path=path[:len(path)-1]} }
}
//回溯实现方式二:
func dfs(beginWord string,endWord string,res *[][]string,path []string,distance map[string]int,graph map[string][]string){path=append(path,beginWord)//出递归条件if beginWord==endWord{tmp:=make([]string,len(path))copy(tmp,path)(*res)=append((*res),tmp)return}//否则遍历图for _,v:=range graph[beginWord]{//遍历图时,朝着距离与终点越来越近的方向进行(当前节点的距离肯定要比下一个距离大1)if distance[beginWord]==distance[v]+1{dfs(v,endWord,res,path,distance,graph)} }//回溯(执行完上述的所有时,将其回溯回去)path=path[:len(path)-1]
}//从终点出发,进行bfs,计算每一个点到达终点的距离
func bfs(endWord string,dict map[string]bool,graph map[string][]string)map[string]int{distance:=make(map[string]int,0) //每个点到终点的距离queue:=make([]string,0)queue=append(queue,endWord)distance[endWord]=0 //初始值for len(queue)!=0{cursize:=len(queue)for i:=0;i<cursize;i++{word:=queue[0]queue=queue[1:]//找到和word有一位不同的单词列表expansion:=expand(word,dict)for _,v:=range expansion{//构造邻接表//我们是从beginWord到endWord构造邻接表,而bfs是从endWord开始,所以构造时,反过来构造//即graph[v]=append(graph[v],word)而不是graph[word]=append(graph[word],v)graph[v]=append(graph[v],word)//表示没访问过if _,ok:=distance[v];!ok{distance[v]=distance[word]+1 //距离加一queue=append(queue,v) //入队列}}}}return distance
}//获得邻接点
func expand(word string,dict map[string]bool)[]string{expansion:=make([]string,0) //保存word的邻接点//从word的每一位开始chs:=[]rune(word)for i:=0;i<len(word);i++{tmp:=chs[i] //保存当前位,方便后序进行复位for c:='a';c<='z';c++{//如果一样则直接跳过,之所以用tmp,是因为chs[i]在变if tmp==c{ continue}chs[i]=cnewstr:=string(chs)//新单词在dict中不存在,则跳过if dict[newstr]{expansion=append(expansion,newstr)}}chs[i]=tmp //单词位复位}return expansion
}

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

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

相关文章

golang结构体struct递归引用异常解决办法: invalid recursive type: xxx refers to itself

异常信息&#xff1a; person.go:13:6: invalid recursive type: Person refers to itself 异常代码&#xff1a; type Person struct{Name stringAge intChild Person // 错误&#xff01; } 原因&#xff1a; 编译器无法确定一个包含自己的字段类型的类型的大小&#xff0c…

Android 安卓通过bindService ServiceConnection 没有响应的问题

bindService 失败且 ServiceConnection 没有响应可能由多种原因造成。以下是一些可能的原因和相应的解决方法&#xff1a; Service未正确声明或注册&#xff1a; 如果Service没有在AndroidManifest.xml文件中正确声明或注册&#xff0c;bindService将会失败。解决方法&#xf…

基于SpringBoot3和JDK17,集成H2数据库和jpa

基于SpringBoot3和JDK17&#xff0c;集成H2数据库和jpa 学会用H2数据库&#xff0c;为了快速写出需要处理数据关系的demo。 文章目录 基于SpringBoot3和JDK17&#xff0c;集成H2数据库和jpa工程配置pom.xml文件application.properties文件 练习H2数据库的操作h2数据库的建表自…

接口测试之XML响应断言

目录 XPath 基本语法XML 响应结果解析XML 响应结果断言 XML 响应数据 如何提取 AddResult 中的值&#xff1f; <soap:Body><AddResponse xmlns"http://tempuri.org/"><AddResult>4</AddResult></AddResponse> </soap:Body> …

【创作活动】如何让大模型更聪明:提升智能的技术策略

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Java基础入门day62

day62 AJAX 概念 AJAX&#xff1a; Asynchronous Javascript And XML AJAX是一种无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术 AJAX是一种用于创建快速动态网页的技术 通过在后台与服务器进行少量数据交换&#xff0c;AJAX可以使网页实现异步更新 传统…

Hbase 面试题(三)

1. 请表述Hbase 实时查询的原理和方式 &#xff1f; HBase支持实时查询&#xff0c;这意味着用户可以即时地访问和检索存储在HBase中的数据。HBase的实时查询原理和方式涉及以下几个关键方面&#xff1a; 内存存储&#xff08;MemStore&#xff09;&#xff1a; 当数据被写入H…

11.3 冒泡排序

目录 11.3 冒泡排序 11.3.1 算法流程 11.3.2 效率优化 11.3.3 算法特性 11.3 冒泡排序 冒泡排序&#xff08;bubble sort&#xff09;通过连续地比较与交换相邻元素实现排序。这个过程就像气泡从底部升到顶部一样&#xff0c;因此得名冒泡排序。 如图 11-4 所示…

【TIPs】 Visual Stadio 2019 中本地误使用“git的重置 - 删除更改 -- hard”后,如何恢复?

环境&#xff1a; VS 2019Windows10本地版本管理&#xff08;非远程&#xff09; 前言&#xff1a; git 在Visual Stadio 2019中集成了git的版本管理&#xff0c;在本地用来做版本管理&#xff0c;本来比较好用。 不过有一次&#xff0c;由于拿最初始的版本的时候&#xf…

JsonCpp源码跨平台编译

1.macos编译jsoncpp: https://github.com/open-source-parsers/jsoncpp.git 克隆jsoncpp源码 使用CMake进行编译 生成makefile mkdir build cd build cmake ../ 编译: make编译并运行测试成功:

数据的表示和运算

目录 一.各进制间的相互转换 1.各进制转化为10进制 2.二进制和八进制&#xff0c;十六进制之间地相互转化 3.十进制转换为其他进制 二.BCD码&#xff08;Binary-Coded Decimal&#xff0c;用二进制编码的十进制&#xff09; 1.8421码 2.余3码 3.2421码 三.无符号整数 …

Pytorch的学习

1.基本数据&#xff1a;Tensor Tensor&#xff0c;即张量&#xff0c;是PyTorch中的基本操作对象&#xff0c;可以看做是包含单一数据类型元素的多维矩阵。从使用角度来看&#xff0c;Tensor与NumPy的ndarrays非常类似&#xff0c;相互之间也可以自由转换&#xff0c;只不过Te…

RabbitMQ一、RabbitMQ的介绍与安装(docker)

一、RabbitMQ相关名词解释 MQ MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。 多用于系统之间的异步通信。 常见的两种通信方式&#xff1a; 同步通信&#xff1a;同步通信相当于两个人当面对话&#xff0c;你一言我…

Qt | QSplitter(分离器或分隔符)、QSplitterHandle 类(分界线)

​01、一、QSplitter 类(分离器) 1、QSplitter 类继承自 QFrame 类,也就是说该类是一个带有边框的可视部件。 2、QSplitter 类实现分离器,分离器用于分离两个部件,用户可通过拖动部件之间的分界线来调整子部件的大小。 3、QSplitter 的原理(见上图):QSplitter 的实现原理…

css 中clip 属性和替代方案 clip-path属性使用

clip clip 属性概述 作用&#xff1a;clip 属性用于定义一个裁剪区域&#xff0c;该区域外的元素内容将不可见。适用元素&#xff1a;clip 属性只对绝对定位&#xff08;position: absolute&#xff09;或固定定位&#xff08;position: fixed&#xff09;的元素有效&#xf…

机器学习第四十一周周报 JTFT

文章目录 week41 JTFT摘要Abstract1. 题目2. Abstract3. 网络架构3.1 JTFT3.2 具有可学习频率的稀疏FD表示3.3 用于提取跨渠道依赖关系的低阶注意力层 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论小结参考文献 week41 JTFT 摘要 本周阅读了题为A Joint Time-…

太空音响器

目录 1&#xff0e;课程设计项目 2.任务和要求 3.总体功能设计与仿真 3.1.元器件汇总 3.2.总体方案设计 3.3 总体电路仿真 4.单元模块设计及电路仿真 4.1 互补型振荡器电路 5.组装&#xff0c;调试与测试 6.分析与总结 7.参考文献 1&#xff0e;课程设…

【scikit-learn010】sklearn算法模型清单实战及经验总结(已更新)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章,作为较火的机器学习框架,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架模型算法包相关技术点及经验。 3.欢迎批评指正,欢迎互三,跪谢一键…

【简单介绍下K-means聚类算法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

rpmbuild多进程批量编译脚本

脚本用法 使用手册 bash spec.sh --help Please ensure the directory ~/rpmbuild exists, And the script can execute in any directory.Usage: bash spec.sh [OPTION]... [*.spec]... [OPTION]...or: bash spec.sh [*.spec]... [OPTION]... [*.spec]... rpmbuild all sp…