127. Word Ladder

文章目录

  • 1 题目理解
  • 2 BFS
  • 3 双向BFS

1 题目理解

给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:

每次转换只能改变一个字母。
转换过程中的中间单词必须是字典中的单词。
说明:

如果不存在这样的转换序列,返回 0。
所有单词具有相同的长度。
所有单词只由小写字母组成。
字典中不存在重复的单词。
你可以假设 beginWord 和 endWord 是非空的,且二者不相同。

输入:两个单词:beginWord,endWord,一个字典
规则:查找从beginWord到endWord的最短转换序列。转换中每次只能变一个字母。转换过程中的单词必须是字典中的单词。
输出:最短序列长度,没有就返回0。

输入:
beginWord = “hit”,
endWord = “cog”,
wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]

输出: 5

解释: 一个最短转换序列是 “hit” -> “hot” -> “dot” -> “dog” -> “cog”,
返回它的长度 5。

2 BFS

解法内容来源于力扣。
要求最短序列,想到要用bfs。想到bfs,自然想到图。题目中的图是隐形的。我们可以抽象出图。
可以将所有单词抽象为一个节点。如果两个单词之间只有一个字母不同,则这两个单词之间有条边。边是双向的。
例子中的图是这样的。我们以beginWord为起点,endWord为终点,找到最短路径。

在这里插入图片描述

在建图过程中,按照普通想法,我们可以枚举每一对词语,看他们是否相差一个字符。但这样效率太低,我们可以优化图。我们可以建一个虚拟节点。对于单词hit创建3个虚拟节点:it,ht,hi*。hit与这三个节点有双向边。如果词典中有一个单词能够转为hi这种格式,那必然它也与hi有条双向边。

最后注意bfs找到最短路径之后,因为加入了虚拟节点所以路径长度需要除以2。

class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {if(wordList==null || !wordList.contains(endWord)){return 0;}Map<String,List<String>> allComboDict = new HashMap<String,List<String>>();addToDict(beginWord,allComboDict);for(String w : wordList){addToDict(w,allComboDict);}Queue<String> queue = new LinkedList<String>();queue.offer(beginWord);int step = 0;Map<String,Boolean> visited = new HashMap<String,Boolean>();while(!queue.isEmpty()){step++;int size = queue.size();for(int i=0;i<size;i++){String node = queue.poll();if(node.equals(endWord)){return step/2+1;}for(String toNode: allComboDict.get(node)){if(!visited.containsKey(toNode)){visited.put(toNode,true);queue.offer(toNode);}}}}return 0;}private void addToDict(String word,Map<String,List<String>> allComboDict ){char[] array = word.toCharArray();List<String> listOfWord = allComboDict.getOrDefault(word,new ArrayList<String>());for(int i=0;i<word.length();i++){char ch = array[i];array[i] = '*';String text = new String(array);List<String> list = allComboDict.getOrDefault(text,new ArrayList<String>());list.add(word);allComboDict.put(text,list);listOfWord.add(text);array[i] = ch;}allComboDict.put(word,listOfWord);}
}

时间复杂度:O(w∗l2)O(w*l^2)O(wl2),w是单词个数,l是每个单词的长度。
建图过程中,对于每个单词需要枚举它连接到的所有虚拟节点,复杂度为O(w),每个单词的长度为l,复杂度为O(wl)。
bfs过程中每个节点最多有l条边。所以最终时间复杂度O(w
l*l)。

3 双向BFS

根据给定字典构造的图可能会很大。BFS的搜索空间会依赖每层的分支数量增加而指数级增加。如果同时使用两个广度优先搜索。一个从beginWord开始搜索,一个从endWord开始搜索。每次从两边各扩展一层节点,当发现某一时刻,两边都访问过同一节点时,就停止搜索。
在这里插入图片描述

class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {if(wordList==null || !wordList.contains(endWord)){return 0;}Map<String,List<String>> allComboDict = new HashMap<String,List<String>>();addToDict(beginWord,allComboDict);for(String w : wordList){addToDict(w,allComboDict);}Queue<String> queue = new LinkedList<String>();queue.offer(beginWord);Map<String,Integer> visited = new HashMap<String,Integer>();visited.put(beginWord,1);Queue<String> queueEnd = new LinkedList<String>();queueEnd.offer(endWord);Map<String,Integer> visitedEnd = new HashMap<String,Integer>();visitedEnd.put(endWord,1);while(!queue.isEmpty() && !queueEnd.isEmpty()){int step = visiteNode(queue,visited,visitedEnd,allComboDict);if(step>0){return step;}step = visiteNode(queueEnd,visitedEnd,visited,allComboDict);if(step>0){return step;}}return 0;}private int visiteNode(Queue<String> queue, Map<String,Integer> visited, Map<String,Integer> checkMap,Map<String,List<String>> allComboDict ){int size = queue.size();for(int i=0;i<size;i++){String node = queue.poll();int step = visited.get(node);if(checkMap.containsKey(node)){return (visited.get(node) + checkMap.get(node))/2;}for(String toNode: allComboDict.get(node)){if(!visited.containsKey(toNode)){visited.put(toNode,step+1);queue.offer(toNode);}}}return -1;}private void addToDict(String word,Map<String,List<String>> allComboDict ){char[] array = word.toCharArray();List<String> listOfWord = allComboDict.getOrDefault(word,new ArrayList<String>());for(int i=0;i<word.length();i++){char ch = array[i];array[i] = '*';String text = new String(array);List<String> list = allComboDict.getOrDefault(text,new ArrayList<String>());list.add(word);allComboDict.put(text,list);listOfWord.add(text);array[i] = ch;}allComboDict.put(word,listOfWord);}
}

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

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

相关文章

第一百零三期:解读回归测试:类型、选择、挑战和实践

本文介绍了回归测试的基本概念、工作方式、面临的挑战、以及业界的优秀实践。 作者&#xff1a;陈峻编译 【51CTO.com快译】有研究表明&#xff1a;在安装了新的应用程序之后&#xff0c;只有四分之一的用户会在次日回到该应用。而大多数用户在首次使用之后就直接将其卸载掉了…

如何构建积木式Web应用

上下文基本上我们在儿童时代都玩过积木玩具。通过一块块的积木&#xff0c;再加上我们的想象力&#xff0c;就可以构造出非常多不同的风格的建筑。那么&#xff0c; 我们可不可以把这种搭积木的方式应用到我们的web应用上呢。问题web应用通过提供给用户一整套组件&#xff08;相…

第一百零四期:搞清这些陷阱,NULL和三值逻辑再也不作妖

NULL 用于表示缺失的值或遗漏的未知数据&#xff0c;不是某种具体类型的值。数据表中的 NULL 值表示该值所处的字段为空&#xff0c;值为 NULL 的字段没有值&#xff0c;尤其要明白的是&#xff1a;NULL 值与 0 或者空字符串是不同的。 作者&#xff1a;youzhibing2904 NULL …

spring mvc学习(19):cookievalue注解(显示cookie的值,默认必须有值)

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

spring mvc学习(20):RequestHeader(获取请求头中某一部分值)

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

spring mvc学习(21):testparam请求参数和请求头表达式

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

spring mvc学习(22):/textpath/*/helen

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

第一百零五期:5年前,跳槽涨薪,你笑了,5年后,跳槽降薪,你慌了!

去年&#xff0c;我在年度绩效面谈中与某中年技术男就 “从测试转向产品经理” 的这个话题上进行了一些探讨与分析。 作者&#xff1a;王晔倞 图片来自 Pexels 或许是因为分析的角度比较客观、真实&#xff0c;再加上俩人都比较会演戏&#xff0c;我激情&#xff0c;他投入&a…

第一百零六期:长相不讨AI喜欢面试就会挂?全球百万求职者经历AI“看脸”面试

AI不仅会筛选你的简历&#xff0c;还会通过看脸决定你能否通过面试。这不是将来时。全球已有超过一百万求职者&#xff0c;经历过AI面试官的冷酷“凝视”。 作者&#xff1a;鱼羊 本文经AI新媒体量子位&#xff08;公众号ID:QbitAI&#xff09;授权转载&#xff0c;转载请联系…

服务器控件HtmlTable下控件赋值问题

在程序开发过程中&#xff0c;碰到这样的问题&#xff1a; 1<table>2<tr>3<td><asp:DropDownList iddropdownlist1 runatserver></td>4</tr>5</table>在基类页中有如下代码&#xff1a;1foreach(Control pagectl inPage.Controls[1]…

Foundry feats. MultiverseStudio

https://www.foundry.com/news-awards/foundry-jcube-announcement 经过这么多年的过程&#xff0c;本周本产品终于发布了PR&#xff0c;这次是由Foundry独家代理销售。 目前本产品已经在全球第一线的工作室的流程内使用&#xff0c;用来装配无法想象巨大的场景&#xff0c;如果…

第一百零七期:她说,嫁人就选程序员!

又是一年双十一&#xff0c;单身狗们还好吗?想脱单?找个程序猿/程序媛是不错的选择&#xff0c;要不要了解一下? 作者&#xff1a;李二狗 图片来自 Pexels 程序员&#xff0c;已经渐渐成当代相亲市场的一只主力军。甚至可以说是“香饽饽”。 越来越多的妹子&#xff0c;在…

第一百零八期:比较容易理解的Hbase架构全解,10分钟学会,建议收藏

依然是Hadoop组件的讲解&#xff0c;今天说到HBase 架构&#xff0c;都是一字一句打出来的&#xff0c;希望各位转发加关注&#xff0c;会一直给大家写优质的内容。 作者&#xff1a;IT技术管理那些事儿 依然是Hadoop组件的讲解&#xff0c;今天说到HBase 架构&#xff0c;都…

315. Count of Smaller Numbers After Self

文章目录1 题目理解2 暴力解法3 分治法1 题目理解 输入&#xff1a;int[] nums 输出&#xff1a;计数的数组int[] counts 规则&#xff1a;counts[i]表示nums中下标大于i&#xff0c;值小于nums[i]的个数 Example 1: Input: nums [5,2,6,1] Output: [2,1,1,0] Explanation: T…

SQL Server执行计划那些事儿(3)——书签查找

接下来的文章是记录自己曾经的盲点&#xff0c;同时也透漏了自己的发展历程&#xff08;可能发展也算不上&#xff0c;只能说是瞎混&#xff09;。当然&#xff0c;一些盲点也在工作和探究过程中慢慢有些眉目&#xff0c;现在也愿意发扬博客园的奉献精神&#xff0c;拿出来和大…

第一百零九期:双十一光棍节调试一个商城必备功能,Java Springboot开源秒杀系统

秒杀系统在电商系统中是非常重要的&#xff0c;不是因为秒杀这个功能重要&#xff0c;而是因为秒杀提现的是一个系统的并发负载能力。例如阿里巴巴或者京东&#xff0c;每年的双十一的峰值&#xff0c;其实就是下一年的常态&#xff0c;双十一各项技术指标&#xff0c;已经作为…

【名额有限】云开发AI拓展能力等你来体验!

这次来了个超厉害的新能力&#xff01; 人脸智能打马赛克、人脸智能裁剪……各种操作&#xff0c;都能一步到位! 迫不及待想体验&#xff0c;戳链接&#xff1a;https://wj.qq.com/s2/3986990/e0ef/ 还没有搞懂&#xff0c;继续往下看—— 基于云开发&#xff0b;AI人脸检测与分…

第一百一十期:详解SpringBoot应用跨域访问解决方案

说到跨域访问&#xff0c;必须先解释一个名词&#xff1a;同源策略。所谓同源策略就是在浏览器端出于安全考量&#xff0c;向服务端发起请求必须满足&#xff1a;协议相同、Host(ip)相同、端口相同的条件&#xff0c;否则访问将被禁止&#xff0c;该访问也就被称为跨域访问。 …

spring mvc学习(23):eclipse创建Maven项目没有src/main/java并不能新建的问题

eclipse里第一次创建Maven项目时&#xff0c;src/main/java与src/test/java目录都不会出现&#xff0c;这是因为eclipse里的一个默认配置。这两个目录是真实存在的&#xff0c;只是隐藏了。 这时候想要让这两个目录出现&#xff0c;就需要修改以下配置&#xff1a; 右击项目-…

spring mvc学习(24):配置maven环境和创建maven项目(建议收藏,超全超详细)

1本次歌谣就对如何创建一个maven项目做一个详细的讲解&#xff0c;毕竟卡了我三天&#xff0c;久久不能入眠&#xff0c;也搜了网上很多的博客 都没有顺利的解决maven项目的创建。这篇建议大家收藏&#xff0c;总会用到的。不然大家看网上的博客也是一脸懵逼。 2首先工具使用…