126. Word Ladder II
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
将所有单词构建桶,便于查找邻接词。构建桶的方式是依次将一个词的各个字母挖空,用字典进行保存
广度优先搜索进行遍历,这里构建三个数据结构:
- beFound:用于标记首次遍历的词,同时记录首次遍历的深度
- preWords:用一个默认列表字典记录到达该节点的前溯词列表,需注意对于每个可能搜索到该词的路径,只要深度不超过已有路径,都应加入前溯词列表
- toSeen:用一个双端队列存储待遍历词及当前深度。
如果搜索到了目标节点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相关推荐
- 【难点+重点BFS】LeetCode 126. Word Ladder II
LeetCode 126. Word Ladder II Solution1: 参考自花花酱:http://zxi.mytechroad.com/blog/searching/leetcode-126 ...
- 算法细节系列(20):Word Ladder系列
算法细节系列(20):Word Ladder系列 详细代码可以fork下Github上leetcode项目,不定期更新. 题目摘自leetcode: 1. Leetcode 127: Word Lad ...
- Leetcode的word ladder问题
127. Word Ladder 题意如下: 给定一个开始字符串和结束字符串以及含有大量字符串的字典,要求通过一定规则,能从开始字符串变换到结束字符串,求其最小变换字符串数目,该规则如下: 1 从开始 ...
- Word Ladder系列
1.Word Ladder 问题描述: 给两个word(beginWord和endWord)和一个字典word list,找出从beginWord到endWord之间的长度最长的一个序列,条件: 1. ...
- PHP第五周答案,算法设计与分析第五周作业——Word Ladder
算法设计与分析第五周作业--Word Ladder 上周找了一道深度搜索优先搜索的算法题来做,于是这周就选了一道广度优先搜索算法题来试试手. 本周所选题目:原题目链接 题目详情 题目大意:给出一个字符 ...
- LeetCode 127. Word Ladder
原题链接在这里:https://leetcode.com/problems/word-ladder/ 题目: Given two words (beginWord and endWord), and ...
- 【DFS + 记忆化递归】LeetCode 140. Word Break II
LeetCode 140. Word Break II Solution1:我的答案 纯DFS,在第31个case时超时,还是记录一下.. class Solution { // DFS public ...
- 【DFS + Backtracking】LeetCode 212. Word Search II
LeetCode 212. Word Search II Solution1:我的答案 暴力搜索..基于第79题的答案,真的是非常之慢啊!!! 快的方法均是基于字典树的方法,真是复杂.. class ...
- 【重点BFS】LeetCode 127. Word Ladder
LeetCode 127. Word Ladder Solution1:我的超过40%的AC的答案 原先利用BFS做但是内存溢出未能AC:进过修改加上了标记是否访问过的visited数组,可以AC啦~ ...
最新文章
- 最全的MySQL基础【燕十八传世】
- 实现UILabel渐变色效果
- YbtOJ#482-爬上山顶【凸壳,链表】
- JAVA_Collection容器
- idea 搜索不到gsonformat_Idea中GsonFormat插件安装
- 计算机控制面板图标怎么删除,电脑如何找回消失的“添加或删除程序”图标
- 1473. A + B 格式
- 交通运输部·车载导航系统——终端如何与服务器通信——玩转通信协议(源码下载)...
- 怎样判断ajax请求,如何判断一个请求为ajax请求?
- python调用接口获取文件_Python中做接口自动化如何读取配置ini文件
- 大数据应用及其解决方案(完整版)
- WAS中间件服务器简介
- 如何在校外下载期刊全文
- websockets_WebSockets简介
- 银行账户管理体系总结
- 西门子200SMART笔记
- 多目视觉三维重建研究综述
- 安卓8.0桌面图标适配
- java 简述类变量和实例变量的区别
- Vue项目实战之电商后台管理系统(二) 主页模块
热门文章
- 初赛问题求解及选择题数学相关整理
- dhtml是基于html的一门语言,什么是DHTML
- 疯狂python讲义pdf_火了!她说:“请给我推荐一本Python书!”
- 实验7.2 二维数组 7-6 方阵循环右移
- 界面 高炉系统_首钢京唐七大系统介绍
- python处理行情数据_请教 Python 如何解析 DBF 文件, SJSHQ.dbf 上交所行情文件,数据来源于巨灵数据。...
- 无风扇网站服务器,这款服务器采用无风扇设计
- 客户端(STS)连接服务器上redis时的问题
- Python 动态载入模块
- git 使用详解(3)—— 最基本命令 + .gitignore 文件