126. 单词接龙 II

126. 单词接龙 II

方法:广度优先遍历、深度优先遍历(回溯)

class Solution {
   
    public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {
   
        List<List<String>> res = new ArrayList<>();
        // 因为需要快速判断扩展出的单词是否在 wordList 里,因此需要将 wordList 存入哈希表,这里命名为「字典」
        Set<String> dict = new HashSet<>(wordList);
        //特殊用例判断
        if (!dict.contains(endWord)) {
   
            return res;
        }
        //因为从beginWord开始扩展,因此dict里一定不可以有beginWord
        dict.remove(beginWord);

        //第1步:广度优先遍历构建图
        //为了避免记录不需要的边,我们需要记录扩展出的单词是在第几次扩展的时候得到的,key:单词,value:在广度优先遍历的第几层
        //steps 记录了已经访问过的word集合,同时记录了在第几层访问到
        Map<String, Integer> steps = new HashMap<>();
        steps.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用Python完成题目的代码示例: ```python from collections import defaultdict, deque def findLadders(beginWord, endWord, wordList): # 构建单词到ID的映射关系 wordId = defaultdict(int) idWord = [] for word in wordList: if word not in wordId: wordId[word] = len(idWord) idWord.append(word) if endWord not in wordId: return [] # 构建图 graph = defaultdict(list) for word in wordList: for i in range(len(word)): mask = word[:i] + '*' + word[i+1:] graph[word].append(wordId[mask]) graph[wordId[mask]].append(wordId[word]) # 使用BFS找到最短路径 res = [] visited = defaultdict(bool) queue = deque([(wordId[beginWord], [[beginWord]])]) minLevel = float('inf') while queue: curWord, path = queue.popleft() if len(path) > minLevel: break if curWord == wordId[endWord]: res.append(path) minLevel = len(path) for neighbor in graph[curWord]: if not visited[neighbor]: visited[neighbor] = True queue.append((neighbor, path + [idWord[neighbor]])) return res # 测试样例 beginWord = "hit" endWord = "cog" wordList = ["hot", "dot", "dog", "lot", "log", "cog"] result = findLadders(beginWord, endWord, wordList) print(result) ``` 这段代码使用了广度优先搜索(BFS)来寻找最短路径。首先构建单词到ID的映射关系,然后构建图,图中的每个节点是一个单词,如果两个单词只有一个字母不同,则它们之间有一条边。下来,使用BFS找到最短路径,并将结果存储在变量`res`中。最后,打印结果。 希望能对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值