Title

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

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

说明:

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

示例 1:

输入:

beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]

输出:

[["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]
]

示例 2:

输入:

beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]

输出:

[]

解释: endWord “cog” 不在字典中,所以不存在符合要求的转换序列。

Solve

  1. 将所有单词构建桶,便于查找邻接词。构建桶的方式是依次将一个词的各个字母挖空,用字典进行保存

  2. 广度优先搜索进行遍历,这里构建三个数据结构:

    • beFound:用于标记首次遍历的词,同时记录首次遍历的深度
    • preWords:用一个默认列表字典记录到达该节点的前溯词列表,需注意对于每个可能搜索到该词的路径,只要深度不超过已有路径,都应加入前溯词列表
    • toSeen:用一个双端队列存储待遍历词及当前深度。
  3. 如果搜索到了目标节点endWord,则依次往前递归输出解:每个解的头节点若包含多个前溯词,则解相应增加。利用python列表嵌套推导式实现。

Code

class Solution:def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:length = len(beginWord)wordList.append(beginWord)# 构建具有邻接关系的桶buckets = defaultdict(list)for word in wordList:for i in range(length):match = word[:i] + '_' + word[i + 1:]buckets[match].append(word)print(buckets)# BFS遍历preWords = defaultdict(list)  # 前溯词列表toSeen = deque([(beginWord, 1)])  # 待遍历词及深度列表beFound = {beginWord: 1}  # 已探测词词列表while toSeen:curWord, level = toSeen.popleft()for i in range(len(beginWord)):match = curWord[:i] + '_' + curWord[i + 1:]for word in buckets[match]:if word not in beFound:beFound[word] = level + 1toSeen.append((word, level + 1))if beFound[word] == level + 1:  # 当前深度等于该词首次遍历深度,则仍应加入前溯词列表preWords[word].append(curWord)if endWord in beFound and level + 1 > beFound[endWord]:  # 已搜索到目标词,且完成当前层遍历break# 列表推导式输出结果if endWord in beFound:res = [[endWord]]while res[0][0] != beginWord:res = [[word] + r for r in res for word in preWords[r[0]]]return reselse:return []

126. Word Ladder II相关推荐

  1. 【难点+重点BFS】LeetCode 126. Word Ladder II

    LeetCode 126. Word Ladder II Solution1: 参考自花花酱:http://zxi.mytechroad.com/blog/searching/leetcode-126 ...

  2. 算法细节系列(20):Word Ladder系列

    算法细节系列(20):Word Ladder系列 详细代码可以fork下Github上leetcode项目,不定期更新. 题目摘自leetcode: 1. Leetcode 127: Word Lad ...

  3. Leetcode的word ladder问题

    127. Word Ladder 题意如下: 给定一个开始字符串和结束字符串以及含有大量字符串的字典,要求通过一定规则,能从开始字符串变换到结束字符串,求其最小变换字符串数目,该规则如下: 1 从开始 ...

  4. Word Ladder系列

    1.Word Ladder 问题描述: 给两个word(beginWord和endWord)和一个字典word list,找出从beginWord到endWord之间的长度最长的一个序列,条件: 1. ...

  5. PHP第五周答案,算法设计与分析第五周作业——Word Ladder

    算法设计与分析第五周作业--Word Ladder 上周找了一道深度搜索优先搜索的算法题来做,于是这周就选了一道广度优先搜索算法题来试试手. 本周所选题目:原题目链接 题目详情 题目大意:给出一个字符 ...

  6. LeetCode 127. Word Ladder

    原题链接在这里:https://leetcode.com/problems/word-ladder/ 题目: Given two words (beginWord and endWord), and ...

  7. 【DFS + 记忆化递归】LeetCode 140. Word Break II

    LeetCode 140. Word Break II Solution1:我的答案 纯DFS,在第31个case时超时,还是记录一下.. class Solution { // DFS public ...

  8. 【DFS + Backtracking】LeetCode 212. Word Search II

    LeetCode 212. Word Search II Solution1:我的答案 暴力搜索..基于第79题的答案,真的是非常之慢啊!!! 快的方法均是基于字典树的方法,真是复杂.. class ...

  9. 【重点BFS】LeetCode 127. Word Ladder

    LeetCode 127. Word Ladder Solution1:我的超过40%的AC的答案 原先利用BFS做但是内存溢出未能AC:进过修改加上了标记是否访问过的visited数组,可以AC啦~ ...

最新文章

  1. 最全的MySQL基础【燕十八传世】
  2. 实现UILabel渐变色效果
  3. YbtOJ#482-爬上山顶【凸壳,链表】
  4. JAVA_Collection容器
  5. idea 搜索不到gsonformat_Idea中GsonFormat插件安装
  6. 计算机控制面板图标怎么删除,电脑如何找回消失的“添加或删除程序”图标
  7. 1473. A + B 格式
  8. 交通运输部·车载导航系统——终端如何与服务器通信——玩转通信协议(源码下载)...
  9. 怎样判断ajax请求,如何判断一个请求为ajax请求?
  10. python调用接口获取文件_Python中做接口自动化如何读取配置ini文件
  11. 大数据应用及其解决方案(完整版)
  12. WAS中间件服务器简介
  13. 如何在校外下载期刊全文
  14. websockets_WebSockets简介
  15. 银行账户管理体系总结
  16. 西门子200SMART笔记
  17. 多目视觉三维重建研究综述
  18. 安卓8.0桌面图标适配
  19. java 简述类变量和实例变量的区别
  20. Vue项目实战之电商后台管理系统(二) 主页模块

热门文章

  1. 初赛问题求解及选择题数学相关整理
  2. dhtml是基于html的一门语言,什么是DHTML
  3. 疯狂python讲义pdf_火了!她说:“请给我推荐一本Python书!”
  4. 实验7.2 二维数组 7-6 方阵循环右移
  5. 界面 高炉系统_首钢京唐七大系统介绍
  6. python处理行情数据_请教 Python 如何解析 DBF 文件, SJSHQ.dbf 上交所行情文件,数据来源于巨灵数据。...
  7. 无风扇网站服务器,这款服务器采用无风扇设计
  8. 客户端(STS)连接服务器上redis时的问题
  9. Python 动态载入模块
  10. git 使用详解(3)—— 最基本命令 + .gitignore 文件