力扣126. 单词接龙 II

按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> … -> sk 这样的单词序列,并满足:

每对相邻的单词之间仅有单个字母不同。
转换过程中的每个单词 si(1 <= i <= k)必须是字典 wordList 中的单词。注意,beginWord 不必是字典 wordList 中的单词。
sk == endWord
给你两个单词 beginWord 和 endWord ,以及一个字典 wordList 。请你找出并返回所有从 beginWord 到 endWord 的 最短转换序列 ,如果不存在这样的转换序列,返回一个空列表。每个序列都应该以单词列表 [beginWord, s1, s2, …, sk] 的形式返回。

示例 1:

输入:beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
输出:[[“hit”,“hot”,“dot”,“dog”,“cog”],[“hit”,“hot”,“lot”,“log”,“cog”]]
解释:存在 2 种最短的转换序列:
“hit” -> “hot” -> “dot” -> “dog” -> “cog”
“hit” -> “hot” -> “lot” -> “log” -> “cog”
示例 2:

输入:beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”]
输出:[]
解释:endWord “cog” 不在字典 wordList 中,所以不存在符合要求的转换序列。

提示:

1 <= beginWord.length <= 7
endWord.length == beginWord.length
1 <= wordList.length <= 5000
wordList[i].length == beginWord.length
beginWord、endWord 和 wordList[i] 由小写英文字母组成
beginWord != endWord
wordList 中的所有单词 互不相同

广度优先搜索:

import collections


def ladderLength(beginWord, endWord, wordList):
    if endWord not in wordList:
        return []
    # 队列元素存的是当前单词节点,和到该单词节点的所有的单词路线
    qu = collections.deque([(beginWord, [[beginWord]])])
    while qu:
        # 一层一层的走,队列里只存一层的单词节点
        s = len(qu)
        qui = {} # 这个字典是用来存储下一层的单词节点,入队用的
        for i in range(s):
            a = qu.popleft()
            if a[0] == endWord:
                return a[1]
            f = set()
            for wi in range(len(wordList)):
                if wordList[wi] == '0':
                    continue
                sa = 0
                for j in range(len(a[0])):
                    if a[0][j] != wordList[wi][j]:
                        sa += 1
                    if sa > 1:
                        break
                if sa == 1:  # 等于1 说明能转化,能作为子节点,下面将拼接路线,并将节点存入字典,
                    if wordList[wi] not in qui:
                        qui[wordList[wi]] = [ai + [wordList[wi]] for ai in a[1]]
                    else:  # 如果这个单词在被作为子节点过了,就直接拼接路线即可,不入队两次
                        qui[wordList[wi]] = qui[wordList[wi]] + [ai + [wordList[wi]] for ai in a[1]]
                    f.add(wi)

        # 遍历完这层的节点之后,下面开始入队下一次单词节点
        for quik in qui:
            qu.append((quik, qui[quik]))
            wordList[wordList.index(quik)] = '0'

    return []


print(ladderLength("hit", "cog", ["hot", "dot", "dog", "lot", "log", "cog"]))

# "hit" -> "hot" -> "dot" -> "dog" -> "cog"
# "hit" -> "hot" -> "lot" -> "log" -> "cog"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值