126. Word Ladder II

126. Word Ladder II

python 复制代码
class Solution:
    def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:
        wordList=set(wordList)

        res=[]
        layer={beginWord:[[beginWord]]}

        while layer:
            newlayer=defaultdict(list)
            for w in layer:
                if w==endWord:
                    res.extend(k for k in layer[w])
                else:
                    for i in range(len(w)):
                        for c in string.ascii_lowercase:
                            neww=w[:i]+c+w[i+1:]
                            if neww in wordList:
                                newlayer[neww]+=[j+[neww] for j in layer[w]]
                
            wordList-=set(newlayer.keys())
            layer=newlayer
        return res
python 复制代码
class Solution:
    def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:
        wordList=set(wordList)

        if endWord not in wordList:
            return []

        wordList.add(beginWord)
        wordDict=defaultdict(list)

        for word in wordList:
            for i in range(len(word)):
                pattern = word[:i]+'*'+word[i+1:]
                wordDict[pattern].append(word)
        
        queue=deque([(beginWord,1)])
        visited,adjList=defaultdict(set),defaultdict(list)
        visited[beginWord]=0
        numStep=1

        while queue:
            currWord,step=queue.popleft()

            if currWord==endWord:
                numStep=step
                break
            
            for i in range(len(currWord)):
                pattern=currWord[:i]+'*'+currWord[i+1:]
                if pattern in wordDict:
                    for word in wordDict[pattern]:
                        if word not in visited or visited[word]==step+1:
                            adjList[word].append(currWord)
                        
                            if word not in visited:
                                queue.append((word,step+1))
                                visited[word]=step+1

        if numStep==1:return []
        result=[]
        array=[endWord]

        self.backtrack(result,array, numStep,beginWord,adjList)
        return result

    def backtrack(self,result,array,numStep,beginWord,adjList):
        if len(array)==numStep and array[-1]==beginWord:
            temp=array.copy()
            result.append(temp[::-1])
            return 
        
        for word in adjList[array[-1]]:
            array.append(word)
            self.backtrack(result,array,numStep,beginWord, adjList)
            array.pop()

卡内存用回溯写法

相关推荐
啊嘞嘞?1 小时前
力扣(滑动窗口最大值)
算法·leetcode·职场和发展
墨染点香1 小时前
LeetCode 刷题【53. 最大子数组和】
数据结构·算法·leetcode
七十二小時2 小时前
力扣热题——前K个高频元素
数据结构·算法·leetcode
愚润求学3 小时前
【贪心算法】day3
c++·算法·leetcode·贪心算法
YuTaoShao4 小时前
【LeetCode 热题 100】75. 颜色分类——双指针
算法·leetcode·职场和发展
小白程序员成长日记7 小时前
8.26学习日志
学习·算法·leetcode
源代码•宸9 小时前
Leetcode—1163. 按字典序排在最后的子串【困难】
经验分享·算法·leetcode·双指针
天选之女wow12 小时前
【LeetCode】动态规划——542.01 矩阵
leetcode·矩阵·动态规划
岁月栖迟16 小时前
leetcode 49. 字母异位词分组
windows·算法·leetcode
Asmalin16 小时前
【代码随想录day 21】 力扣 77. 组合
算法·leetcode·职场和发展