[leetcode126]word ladder 2
来源:互联网 发布:java读英文文件乱码 编辑:程序博客网 时间:2024/05/20 17:21
word ladder 2
Given two words (beginWord and endWord), and a dictionary’s word list, find all shortest transformation sequence(s) from beginWord to endWord, such that:
Only one letter can be changed at a time
Each intermediate word must exist in the word list
For example,
Given:
beginWord = “hit”
endWord = “cog”
wordList = [“hot”,”dot”,”dog”,”lot”,”log”]
Return
[
[“hit”,”hot”,”dot”,”dog”,”cog”],
[“hit”,”hot”,”lot”,”log”,”cog”]
]
Note:
All words have the same length.
All words contain only lowercase alphabetic characters.
算法:
同样是最短路径问题,应该使用BFS。
但是,结果要求得到所有最短路径。
这时仅仅有BFS是不够的,我们需要构建从起点到终点的倒序图。
这就需要BFS以父层,子层遍历的形式进行搜索。
为了得到最后的路径,要利用生成的图从终点进行回溯,直到得到所有最短路径。
from collections import defaultdictclass Solution(object): def findLadders(self, start, end, wordDict): """ :type start: str :type end: str :type dict: Set[str] :rtype: List[List[str]] """ # first build the child - father tree. tree is implemented by dict # second get the path from the tree tree = defaultdict(list) wordDict.add(end) curLevel = set() nextLevel = set() visited = set() curLevel.add(start) find = False while curLevel and not find: for node in curLevel: visited.add(node) for node in curLevel: for scss in self.successor(node, wordDict): if scss == end: find = True if scss not in visited: nextLevel.add(scss) tree[scss].append(node) curLevel = nextLevel nextLevel = set() result = [] print('tree is', tree) if find: path = [] self.gener_path(tree, start, end, path, result) return result def gener_path(self, tree, start, word, path, result): path = path + [word] print(word, path, result) if start == word: result.append(list(reversed(path))) else: for father in tree[word]: self.gener_path(tree, start, father, path, result) def successor(self, curStr, wordDict): result = [] curList = list(curStr) for idx in range(len(curStr)): for ele in 'abcdefghijklmnopqrstuvwxyz': temp = curList[idx] if ele != temp: curList[idx] = ele newStr = ''.join(curList) curList[idx] = temp if newStr in wordDict: result.append(newStr) return resultsolution = Solution()wordSet = set(["hot","cog","dog","tot","hog","hop","pot","dot"])start = 'hot'end = 'dog'print(solution.findLadders(start,end,wordSet))('tree is', defaultdict(<type 'list'>, {'hog': ['hot'], 'hop': ['hot'], 'pot': ['hot'], 'dog': ['hog', 'dot'], 'tot': ['hot'], 'cog': ['hog'], 'dot': ['hot']}))('dog', ['dog'], [])('hog', ['dog', 'hog'], [])('hot', ['dog', 'hog', 'hot'], [])('dot', ['dog', 'dot'], [['hot', 'hog', 'dog']])('hot', ['dog', 'dot', 'hot'], [['hot', 'hog', 'dog']])[['hot', 'hog', 'dog'], ['hot', 'dot', 'dog']]
0 0
- [leetcode126]word ladder 2
- LeetCode126 Word Ladder II
- LeetCode126—Word Ladder II
- word ladder &word ladder 2
- leetcode126:Word Ladder II 详细结题报告 以及java实现源代码
- Word Ladder 2
- leetcode word ladder 2
- 127. Word Ladder 2
- Word Ladder
- Word Ladder
- word ladder
- Word Ladder
- Word Ladder
- Word Ladder
- Word Ladder
- Word Ladder
- Word Ladder
- Word Ladder
- 开发经验交流-----ServiceUtil工具类
- log等级
- logback输出到控制台和文件--配置
- textview圆角只有左上角有效的问题
- redis简介
- [leetcode126]word ladder 2
- redis命令
- 线段树详解
- dubbo入门
- 设计模式学习笔记(一)工厂模式
- 关于坦克在其他客户端能够显示,但是不能运动的错误的定位
- Activity的生命周期
- ATG执行sql部分示例
- 如何脱机查看安卓的官方api