126. Word Ladder II

126. Word Ladder II

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
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. 126. Word Ladder II

    2024-01-17 12:02:01       37 阅读
  2. PYTHON 120道题目详解(106-108)

    2024-01-17 12:02:01       20 阅读
  3. IOS面试题object-c 121-125

    2024-01-17 12:02:01       19 阅读
  4. IOS面试题object-c 116-120

    2024-01-17 12:02:01       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-17 12:02:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-17 12:02:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-17 12:02:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-17 12:02:01       20 阅读

热门阅读

  1. 【Leetcode】2719. 统计整数数目

    2024-01-17 12:02:01       31 阅读
  2. C++客户端服务器TCP创建

    2024-01-17 12:02:01       30 阅读
  3. 机器学习之泊松分布及均匀分布

    2024-01-17 12:02:01       28 阅读
  4. 1.3 面试经典150题 - 删除有序数组中的重复项

    2024-01-17 12:02:01       34 阅读
  5. 医院体检中心客户满意度抽样方法

    2024-01-17 12:02:01       36 阅读
  6. Linux 压缩解压

    2024-01-17 12:02:01       30 阅读
  7. C++中的指针、引用和数组

    2024-01-17 12:02:01       29 阅读
  8. JWT详解

    2024-01-17 12:02:01       31 阅读
  9. nginx配置中关于try_file的一些问题

    2024-01-17 12:02:01       29 阅读