python算法习题(八):单词接龙 II

版权声明:本文为博主原创文章,欢迎转载,但请注明原文出处。 https://blog.csdn.net/GiveMeFive_Y/article/details/79924455

1. 题目

给出两个单词(start和end)和一个字典,找出所有从start到end的最短转换序列
比如:
每次只能改变一个字母。
变换过程中的中间单词必须在字典中出现。

注意事项

所有单词具有相同的长度。 所有单词都只包含小写字母。

样例
给出数据如下:
start = “hit”
end = “cog”
dict = [“hot”,”dot”,”dog”,”lot”,”log”]
返回
[
-[“hit”,”hot”,”dot”,”dog”,”cog”],
-[“hit”,”hot”,”lot”,”log”,”cog”]
]

2. 思路

递归穷举。

3. 代码

# 判断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']
]

4. 总结

类似方法还有最小危险路径,有兴趣的网友可以参考系列九。

猜你喜欢

转载自blog.csdn.net/GiveMeFive_Y/article/details/79924455