127. 单词接龙

https://leetcode-cn.com/problems/word-ladder/
思路和126差不多,区别在于只用bfs,每次访问一层,用一个map来存储访问过的结点以及与起点的距离,避免重复访问。最后输出map中的终点项即可

import queue
class Solution:
    def ladderLength(self, beginWord, endWord, wordList):
        """
        :type beginWord: str
        :type endWord: str
        :type wordList: List[str]
        :rtype: int
        """
        
        nodeNeighbors = {}  #所有邻居信息
        dict = set(wordList)
        distances = {}  #所有距离信息
        
        dict.add(beginWord)
        self.bfs(beginWord, endWord, dict, nodeNeighbors, distances)

        if endWord in distances:
            return distances[endWord] + 1
        else:  #若不存在,说明无法到达
            return 0
        
    def bfs(self, start, end, dict, nodeNeighbors, distances):
        for d in dict:
            nodeNeighbors[d] = []
                
        q = queue.Queue()
        q.put(start)
        distances[start] = 0
        
        while not q.empty():
            count = q.qsize()
            foundEnd = False
            
            for i in range(count):
                cur = q.get()
                neighbors = self.getNeighbors(cur, dict)
                for neighbor in neighbors:
                    nodeNeighbors[cur].append(neighbor)
                    if neighbor not in distances:  #避免重复访问
                        distances[neighbor] = distances[cur] + 1
                        if neighbor == end:
                            foundEnd = True
                        else:
                            q.put(neighbor)
            if foundEnd:
                break
        
    def getNeighbors(self, nodeString, dict):
        res = []
        chs = list(nodeString)
        for i in range(len(chs)):
            for ch in 'abcdefghijklmnopqrstuvwxyz':
                if ch == chs[i]:  #跳过,换成其他字符
                    continue
                tmp = chs[i]
                chs[i] = ch  #替换
                newString = "".join(chs)
                if newString in dict:
                    res.append(newString)
                chs[i] = tmp  #还原
        return res                      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值