[220212] Word Ladder

transformation sequence from word beginWord to word endWord using a dictionary wordList is a sequence of words beginWord -> s1 -> s2 -> ... -> sk such that:

  • Every adjacent pair of words differs by a single letter.
  • Every si for 1 <= i <= k is in wordList. Note that beginWord does not need to be in wordList.
  • sk == endWord

Given two words, beginWord and endWord, and a dictionary wordList, return the number of words in the shortest transformation sequence from beginWord to endWord, or 

if no such sequence exists.

from collections import defaultdict, deque


class Solution:
    def ladderLength(self, beginWord, endWord, wordList):

        if endWord not in wordList:
            return 0

        if beginWord not in wordList:
            wordList.append(beginWord)

        # record graph[pattern] = corresponding words
        # E.g., '*ot': ['hot', 'dot', 'lot']
        graph = defaultdict(list)
        for word in wordList:
            for i in range(len(word)):
                pattern = word[:i] + '*' + word[i+1:]
                graph[pattern].append(word)

        # BFS - q: deque to pop current word; path: record words already seen
        q = deque([beginWord])
        path = set()
        path.add(beginWord)
        count = 1

        while q:
            for i in range(len(q)):
                word = q.popleft()
                if word == endWord:
                    return count

                for j in range(len(word)):
                    pattern = word[:j] + '*' + word[j+1:]
                    # for each word following this pattern
                    for w in graph[pattern]:
                        if w not in path:
                            q.append(w)
                            path.add(w)
            # path length += 1
            count += 1

        return 0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值