给出两个单词(start和end)和一个字典,找出所有从start到end的最短转换序列
比如:
每次只能改变一个字母。
变换过程中的中间单词必须在字典中出现。
注意事项
所有单词具有相同的长度。 所有单词都只包含小写字母。
样例
给出数据如下:
start = “hit”
end = “cog”
dict = [“hot”,”dot”,”dog”,”lot”,”log”]
返回
[
-[“hit”,”hot”,”dot”,”dog”,”cog”],
-[“hit”,”hot”,”lot”,”log”,”cog”]
]
递归穷举。
# 判断a和b只有按顺序一个字母不同
def isOneDiff(a, b):
count = 0
for i in range(len(a)):
if a[i] != b[i]:
count += 1
if count == 1:
return True
else:
return False
def findLadders(start, end, dt):
ret = []
def loop(wa, wb, lt, res=[]):
for i in lt:
# wa表示当前单词,wb表示目的单词,lt表示剩余单词,i表示字典选择单词,res表示转化记录
if isOneDiff(wa, i) and isOneDiff(i, wb):
r= res.copy()
r.append(wa)
r.append(i)
r.append(wb)
ret.append(r)
if isOneDiff(wa, i) and not isOneDiff(i, wb):
r = res.copy()
r.append(wa)
lt_copy = lt.copy()
try:
lt_copy.remove(wa) # 因为开始和结尾不在字典里,所以可能报错
except:
pass
loop(i, wb, lt_copy, r)
loop(start, end, dt)
return ret
print(findLadders('hit', 'cog', ["hot","dot","dog","lot","log"]))
结果(这里列出所有可能情况,并不是题目最终答案):
[
['hit', 'hot', 'dot', 'dog', 'cog'],
['hit', 'hot', 'dot', 'lot', 'log', 'cog'],
['hit', 'hot', 'lot', 'dot', 'dog', 'cog'],
['hit', 'hot', 'lot', 'log', 'cog']
]
类似方法还有最小危险路径,有兴趣的网友可以参考系列九。