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,一经查实,立即删除!

相关文章

关于DataAdapter打开和关闭连接

今天看书的时候,终于看明白了DataAdapter相关的打开和关闭连接的问题DataAdapter使用的时候可以不显示的打开或关闭连接,这是因为DataAdapter能够自动的处理该任务.如果在调用Fill方法的时候连接是关闭的,则连接会自动打开,然后从数据库中把数据记录填充到DataSet中,接着连接会…

讨论ALL_ROWS模式和FIRST_ROWS模式

在CBO的优化模式下&#xff0c;我们可以使用optimizer_mode参数控制优化模式。主要有两种模式&#xff0c;一种是ALL_ROWS模式&#xff0c;另外一种是FIRST_ROWS模式。 ALL_ROWS模式适用场景&#xff1a;希望优化程序给出一种尽快得到全部记录的执行计划&#xff0c;目标是增加…

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

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

126. Word Ladder II

文章目录1 题目理解2 BFS1 题目理解 题目要求和127是一样的。返回值不一样。返回值要求把最短路径的&#xff0c;具体路径输出。 Input: beginWord “hit”, endWord “cog”, wordList [“hot”,“dot”,“dog”,“lot”,“log”,“cog”] Output: [ [“hit”,“hot”,“…

如何构建积木式Web应用

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

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

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

752. Open the Lock

文章目录1 题目理解2 BFS3 用int构建状态1 题目理解 一个钟表有4个槽&#xff0c;每个槽可以停在0-9&#xff0c;10个状态。钟表每个槽的轮子可以转&#xff0c;例如可以从0转到9&#xff0c;也可以从0转到1。 钟表的起始状态是"0000"。每个数字代表一个槽的状态。 …

移动开发 视频收集

构建基于SQL CE的移动方案http://download.chinaitlab.com/video/files/8282.html转载于:https://www.cnblogs.com/Regal/archive/2006/03/23/356800.html

移动混合开发之android文件管理新建文件和删除文件

今天经过一天超过8小时的实践&#xff0c;有很多CSS上的细节需要注意&#xff1a; 1&#xff0c; /*注意是对before的操作*/ .content ul li .icon-check-empty:before{display: block;/*webFont设置其width和height时无效,只有设置font-size*//*width: 3rem;*//*height: 3rem;…

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…

续:C#串口操作

今天继续写C#的工业扫描串口。突然遇到一个很奇怪的问题&#xff1a;那就是我要求把某些码得到之后进行业务处理&#xff0c;但是就是这个时候突然发现扫描出来的 码位数不正确了&#xff01;我就很怀疑自己的代码逻辑了。于是&#xff0c;我就逐行进行调试&#xff0c;而接受口…

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…

698. Partition to K Equal Sum Subsets

文章目录1 理解题目2 分析2.1进一步优化2.2 根据花花酱解答1 理解题目 Given an array of integers nums and a positive integer k, find whether it’s possible to divide this array into k non-empty subsets whose sums are all equal. 输入&#xff1a;一个int数组nums…

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…

OpenGL ES GLKit初探

#GLKit框架 GLKit框架的设计目的是为了简化OpenGL/OpenGL ES的应用开发。它的出现加快了OpenGL或OpenGL ES应用程序的开发。使用数学库、背景纹理加载&#xff0c;预先创建着色器效果&#xff0c;以及标准视图和视图控制器来实现渲染循环。 GLKit框架提供了功能和类&#xff0c…

一个封装了的ADO类,功能非常强大,并做了一个DEMO演示如何操作ACCESS数据库

呵呵&#xff0c;说实在的&#xff0c;这个类俺是从外国论坛上下载的&#xff0c;自己研究了下如何使用并做了一个DEMO&#xff0c;演示如何操作ACCESS数据库。希望给那些没有接触数据库编程的初学者一点启发吧。有任何问题请及时与我联系^_^。程序下载地址&#xff1a;/Files/…

93. Restore IP Addresses

文章目录1 题目理解2 回溯1 题目理解 输入&#xff1a;字符串s 输出&#xff1a;可能的ip地址 规则&#xff1a;一个有效的ip地市是一连串数字&#xff0c;数字范围在0到255&#xff0c;每个数字不能有前导0。例如"0.1.2.201" and "192.168.1.1"是有效ip地…

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…

131. Palindrome Partitioning

文章目录1 题目理解2 回溯3 动态规划1 题目理解 输入&#xff1a;字符串s 规则&#xff1a;将字符串s分割&#xff0c;分割后每一个部分都是一个回文串。 输出&#xff1a;所有的分割方式 Example 1: Input: s “aab” Output: [[“a”,“a”,“b”],[“aa”,“b”]] Examp…

4 文件操作 支持图片 视频 mp3 文本等

#文件操作:send_file,支持图片 视频 mp3 文本等app.route("/img")def img(): return send_file("1.jpg")转载于:https://www.cnblogs.com/ajaxa/p/11156483.html