单词接龙

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

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

说明:

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

示例 1:

输入:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]输出: 5解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",返回它的长度 5。

示例 2:

输入:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]输出: 0解释: endWord "cog" 不在字典中,所以无法进行转换。

分析

最短路径,当然是首选BFS。

思路就是用队列存储经过变换能够得到的单词(在单词表中也出现的),每次取队首元素,遍历其每个字符,将字符依次置换为a~z,判断置换后的新词是否单词表中存在,如果存在,则将该新词入队,如果新词和最后目标词相同,那么输出长度。循环上述操作,直到队列为空时,如果还没有任何词和目标词相同,那么输出0。

一些问题:

  1. 如何记录变换序列长度?

    通过插入在队列中插入”,”,经过一次变换能够到达的单词放在一起,经过二次变换能够到达的单词放在一起,然后通过”,”将这两堆隔开,一次类推。所以只需要判断扫描到的”,”个数就知道经过了几次字符变换,自然输出长度就不是难事了。

  2. 如何快速从wordList中查找删除元素?

    我最开始写的时候直接遍历wordList查找,但是有测试用例提示我TLE了 = =。于是我将wordList 转存到一个HashMap中(毕竟查找是O(1)时间),之后就成功A了。

代码

class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {//按照题中意思,本身也在转换序列中,因此初始为1int res = 1;//BFS 基本都是少不了队列Queue<String> queue = new LinkedList<String>();//将字典转换到HashMap中,应对后面字典中词量过大,查找太耗时//value默认为1,表示存在该词,为0则表示该词已被删除。HashMap<String,Integer> dict = new HashMap<>();for(String s : wordList){dict.put(s,1);}//队列每一层以","分隔(每一层指当前单词变换一个字符后所能得到的所有单词)queue.offer(beginWord);queue.offer(",");while(!queue.isEmpty()){String wordString = queue.poll();StringBuilder word = new StringBuilder(wordString);//仍处在当前层中if(!wordString.equals(",")){//二重循环,将每个单词的每个字符都在a~z置换一次,查找是否单词表中存在该词for(int i=0;i<word.length();i++){char tmp = word.charAt(i);for(char c = 'a';c<='z';c++){if(c == word.charAt(i)){continue;}word.setCharAt(i,c);//查找单词表if(dict.getOrDefault(word.toString(),0)!=0){//单词表中存在该词,加入到队列中,同时从单词表中删去改词,避免 hit->hot->hit此类情况。queue.offer(word.toString());dict.put(word.toString(),0);//如果当前词和endWord 相同,输出。                     if(word.toString().equals(endWord)){return res+1;}}}word.setCharAt(i,tmp);}}else if(!queue.isEmpty()){//上一层处理完,要处理下一层queue.offer(",");res++;}}return 0;}
}

LeetCode 高级 - 单词接龙相关推荐

  1. LeetCode 126. 单词接龙 II(图的BFS)

    1. 题目 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列. 转换需遵循如下规则: 每次转换只能 ...

  2. LeetCode 127. 单词接龙(图的BFS/双向BFS)

    文章目录 1. 题目 2. 图的BFS解题 2.1 单向BFS 2.2 双向BFS !厉害了 1. 题目 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord ...

  3. Leetcode.126 单词接龙 II

    题目链接 Leetcode.126 单词接龙 II 题目描述 按字典 wordList完成从单词 beginWord到单词 endWord转化,一个表示此过程的 转换序列 是形式上像 beginWor ...

  4. Java实现 LeetCode 127 单词接龙

    127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ...

  5. leetcode 126. 单词接龙 II

    leetcode 126题 介绍 方法一 代码 Solution.java Test.java 方法二 算法介绍 在这个过程中需要注意的问题 代码 Solution.java Test.java 介绍 ...

  6. LeetCode 127. 单词接龙(C++)*

    思路: 1.如果采用回溯法来的话会超时: 2.这里采用构造图和广度优先遍历结合来实现:首先要构造图,需要将每个字符串对应一个数字id,然后边的构造使用矩阵来实现,这里采用将每一个字符串的id连接每个将 ...

  7. leetcode 127. 单词接龙(bfs)

    给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字母. 转换过程中的中 ...

  8. LeetCode 126 单词接龙 II

    题目描述 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则:每次转换只能改变一 ...

  9. LeetCode 127. 单词接龙(广度优先遍历)

    题目描述 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字母. 转换 ...

最新文章

  1. 圣诞日记2010-12-25:认清形势,看清方向,正确选择,努力拼搏(更新 )
  2. matlab 如何hidden,Matlab基本函数-hidden函数
  3. ArcGIS实验教程——实验十一:影像拼接与提取
  4. 制作alipay-sdk-java包到本地仓库
  5. 矩形嵌套(NYOJ-16)
  6. mysql mpm_使用Zabbix + MPM全面监控MySQL
  7. Vue使用v-for绑定两个属性拼接渲染界面
  8. 如何联机调试和发布程序
  9. windows系统常用运行命令大全
  10. 计算机农业应用与3S技术论文,3S技术在精细农业中的应用实例分析
  11. mysql5.7 jmeter_JMeter5连接Mysql数据库
  12. 冰点还原离线激活_冰点还原密钥,手把手教你如何激活冰点还原
  13. code vs 集成tfs_Microsoft强大团队(源代码)管理工具--TFS2010 与vs结合
  14. 安卓wifi测速android,WiFi测速管家
  15. Revit二次开发之 自定义选项卡排在最前端
  16. Python入门习题(63)——OpenJudge百练习题:DNA排序
  17. windows C 调用音频输出设备 实现播放
  18. 【Mask scoring RCNN】实现目标检测
  19. SQL Server-检索数据
  20. c语言编码 企业发放德奖金,C语言 · 企业奖金发放

热门文章

  1. 虚拟键盘挡住输入框的问题
  2. 基于物联网技术的盆栽环境监测系统的设计
  3. 为何16寸的笔记本电脑开始兴起?
  4. 析构函数声明无效_C++基类的析构函数为何要声明为虚函数
  5. MySQL高级之索引优化分析
  6. 丝雨学姐小灶班——Week 6
  7. android装备选择,原神迪卢克武器怎么选_原神迪卢克武器选择推荐
  8. 从奥运会票务系统瘫痪所看到的
  9. 上周热点回顾(9.11-9.17)
  10. 成年果蝇~大脑连接组