word ladder2
来源:互联网 发布:淘宝店铺怎么利用营销 编辑:程序博客网 时间:2024/05/24 01:49
Word Ladder II
描述
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start
to end, such that:
• Only one letter can be changed at a time
• Each intermediate word must exist in the dictionary
For example, Given:
start = "hit"
end = "cog"
dict = ["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.
题意:给定start单词,end单词,以及一个dict字典。要求找出start到end的所有最短路径,路径上的每个单词都要出现在dict中,且每次改变一个字母。如start="hit"; end="cog"; dict={"hot","dot","dog","lot","log"},则答案为:[["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]]。这是leetcode oj给的例子。我在实现的时候发现这个例子有点问题:end单词不在dict中。实际的测试用例应该是start和end单词都在dict中的,因为如果提前做一个删除start或者end单词的操作的话,就通不过了。我用正确的程序去测试oj给的这个例子也无法通过,就姑且认为start单词和end单词都在dict中吧,这样写出来的程序才能通过。Word Ladder II这一道题还是比较难的,是leetcode oj中通过率最低的一道题。而由于我一直在用python来刷题,且一直在网上找不到用python写的解法,自己又写不出来,所以参考了网上的C++解法以及kitt的python程序,在此表示感谢。
解题关键点:
1,这里的dict是python中的set()类型。
2,使用前驱单词表prevMap(是字典类型)来记录单词的前驱。比如prevMap={cog:[log, dog]}表示cog的前驱是:log和dog。
3,在word ladder这道题中我们使用了队列,在word ladder ii中也需要使用队列,只不过在这个程序中使用了两个set()来模拟队列(candidates)。candidates[previous]中存储的是前一层的单词。如{dot,lot}为第3层单词。在程序开始执行时,先将candidates[previous]中的单词(前一层的单词)在dict中删除,再将candidates[current]清空,然后根据candidates[previous]中的单词寻找下一层的单词,如{dot,lot}的下一层为{dog,log},并将{dog,log}存入candidates[current]中,同时将单词存入前驱单词表中。下一次循环开始时,上一次循环的candidates[current]变成了candidates[previous],而上一次循环的candidates[previous]变成了candidates[current]并清空。如此反复执行,当某一次循环中的candidates[current]中出现了end单词时,说明我们的路径已经找出来了,工作完成了。
4,程序中使用了一个子函数buildpath来重建每一条路径。如oj给的例子所产生的prevMap={‘cog’:[‘log’,’dog’], ‘log’:[‘lot’], ‘dog’:[‘dot’], ‘lot’:[‘hot’],’dot’:[‘hot’], ‘hot’:[‘hit’]},这个prevMap可以使用DFS来重建每一条路径。
本解法来自:
http://www.cnblogs.com/zuoyuan/p/3697045.html
但是很多细节不明白,寻求大家的帮助.
1 class Solution: 2 # @param start, a string 3 # @param end, a string 4 # @param dict, a set of string 5 # @return a list of lists of string 6 def findLadders(self, start, end, dict): 7 def buildpath(path, word): # path is a list; word is a string 8 if len(prevMap[word])==0: #prevMap: dict #Blank prevMap means all the node in the path is visited 9 path.append(word); 10 currPath=path[:] # hard copy path to currPath. No link between pat and currPath11 currPath.reverse(); 12 result.append(currPath)13 path.pop(); #remove the end element14 return15 path.append(word)16 for iter in prevMap[word]: # reverse the path,17 buildpath(path, iter)18 path.pop()19 20 result=[]21 prevMap={} # prevMap is a dict22 length=len(start)23 for i in dict: #dict: is a set24 prevMap[i]=[] # set the value for each key as blank string25 candidates=[set(),set()]; current=0; previous=126 candidates[current].add(start) # set0 add start27 while True:28 current, previous=previous, current #下一次循环开始时,上一次循环的candidates[current]变成了candidates[previous],而上一次循环的candidates[previous]变成了candidates[current]并清空29 for i in candidates[previous]: dict.remove(i) #先将candidates[previous]中的单词(前一层的单词)在dict中删除30 candidates[current].clear() #再将candidates[current]清空31 for word in candidates[previous]: #再据candidates[previous]中的单词寻找下一层的单词32 for i in range(length):33 part1=word[:i]; part2=word[i+1:]34 for j in 'abcdefghijklmnopqrstuvwxyz':35 if word[i]!=j:36 nextword=part1+j+part237 if nextword in dict:38 candidates[current].add(nextword) #将下一层存入candidates[current]中39 prevMap[nextword].append(word) #同时将单词存入前驱单词表中40 if len(candidates[current])==0: return result #当集合为空,返回结果41 if end in candidates[current]: break #当循环中的candidates[current]中出现了end单词时,说明我们的路径已经找出来了,工作完成了。42 buildpath([], end) #重建每一条路径。prevMap is a dict,这个prevMap可以使用DFS来重建每一条路径。43 return result
- word ladder2
- word Ladder2
- pongo(csdn英雄会)题解之最小操作数---leetcode之word ladder2
- word
- word
- word
- word
- WORD
- word
- word
- Word
- word
- .word
- word
- Word
- Word
- word
- Word
- word ladder
- thinkphp整合系列之友盟消息推送
- C#-如何ping IP
- UVA1600 Dfs回溯完全遍历+记忆化搜索(用最小距离剪枝)+细节处理 (值得复习)(水)
- Android消息机制原理剖析—Handler篇
- word ladder2
- 类型转换_C++中的int&
- leetcode_c++:Find Minimum in Rotated Sorted Array (153)
- Spring定时任务的几种实现
- 电梯调度算法 summary
- Linux内核通信之---proc文件系统(详解)
- Oracle的存储结构 2013-03-26 23:22 276人阅读 评论(0) 收藏 举报 目录(?)[+] Oracle的存储结构 在ORACLE数据库中对于数据存储的管理可以从两方面来论述。
- maven
- 【步兵 lua】尾递归 打印table