Leetcode 127. Word Ladder(python+cpp)

博客介绍了LeetCode 127题——Word Ladder的解决方案,主要使用单向广度优先搜索(BFS)策略。通过建立单词间的边连接,利用Python的defaultdict存储单词模式及其对应单词,并使用集合(visited)记录已访问单词,避免环路。文中指出,最初的实现存在错误,可能导致重复访问节点,正确的做法是在入队列时将单词加入visited。最后,博主提供了C++的两种实现方式,一种模仿Python的defaultdict,另一种通过暴力替换字符进行查询,后者效率较低。
摘要由CSDN通过智能技术生成

Leetcode 127. Word Ladder

题目

在这里插入图片描述

解析:

这道题目本质上是个无向图的题目,wordlist中每个单词作为一个节点,每个节点之间如果只差一个字母则有边相连。求开始节点到结束节点的最短距离。方法好像挺多的,最快的是双向BFS,但是我这边只提供最简单易懂的单向BFS,双向的方法后面再说吧。

最简单的思路包含三个部分:

  • 第一是一个字典,字典的key为通用的word pattern,比如’d*g’,而value是一个list,包含所有符合这个pattern的word,比如[dog,dig,dug]。在python里直接用collections.defaultdict(list)就可以完成
  • 第二个是visited,用set表示,用来包含所有已经访问过的word防止访问过程中成环
  • 第三个是BFS所需要用到的队列,队列里的元素是pair,包含这个word本身和到达这个word所需要的步数

用python写就非常简洁,代码如下:

class Solution:
    def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
        adj = collections.defaultdict(list)
        for word in wordList:
            for i in range(len(word)):
                adj[word[:i]+'*'+word[i+1:]].append(word)
        
        visited = set()
        q = collections.deque()
        q.append((beginWord,1))
        
        while q:
            word,k = q.popleft()
            if word == endWord:
                return k
            
            if word not in visited:
                visited.add(word)
                
                for i in range(len(word)):
                    neighbors = word[:i]+'*'+word[i+1:]
                    for neigh in adj[neighbors]:
                        if neigh not in visited:
                            q.append((neigh,k+1))
        return
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值