对应 126. 单词接龙 II

问题描述

按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> ... -> sk 这样的单词序列,并满足:

  • 每对相邻的单词之间仅有单个字母不同。
  • 转换过程中的每个单词 si(1 <= i <= k)必须是字典 wordList 中的单词。注意,beginWord 不必是字典 wordList 中的单词。
  • sk == endWord

给你两个单词 beginWord 和 endWord ,以及一个字典 wordList 。请你找出并返回所有从 beginWord 到 endWord 的 最短转换序列 ,如果不存在这样的转换序列,返回一个空列表。每个序列都应该以单词列表 [beginWord, s1, s2, ..., sk] 的形式返回。

解决思路

相比较于之前的 127.单词接龙,该问题需要在找到最短路径的基础上再找到所有的可行路径。一般的思路就是首先搜索一遍,找到可能存在的路径,再通过深度优先搜索找到所有的最短路径

实现

具体实现如下

class Solution {
List<List<String>> ans = new ArrayList<>();
Set<String> dict = new HashSet<>(); public List<List<String>> findLadders(String s, String e, List<String> wl) {
dict.addAll(wl);
if (!dict.contains(e)) return ans; Map<String, Integer> steps = new HashMap<>();
Map<String, List<String>> from = new HashMap<>(); // 记录每层出现的单词,方便之后的 DFS
steps.put(s, 0); int step = 1;
boolean found = false;
int n = s.length(); Deque<String> d = new LinkedList<>();
d.offer(s); // 首先 BFS 找到可行的路径
while (!d.isEmpty()) {
int size = d.size();
while (size-- > 0) {
String curWord = d.poll();
char[] array = curWord.toCharArray();
for (int i = 0; i < n; ++i) {
char ch = array[i];
for (int j = 0; j < 26; ++j) {
array[i] = (char) ('a' + j);
String sub = String.valueOf(array);
if (steps.containsKey(sub) && step == steps.get(sub)) {
from.get(sub).add(curWord);
}
if (!dict.contains(sub)) continue; dict.remove(sub);
d.offer(sub); from.putIfAbsent(sub, new ArrayList<>());
from.get(sub).add(curWord); steps.put(sub, step);
if (sub.equals(e)) found = true;
}
array[i] = ch;
}
} step++;
if (found) break;
} if (!found) return ans; // DFS 搜素所有的可行路径
Deque<String> path = new ArrayDeque<>();
path.add(e);
dfs(path, from, e, s); return ans;
} void dfs(Deque<String> path, Map<String, List<String>> from, String cur, String des) {
if (cur.equals(des)) {
ans.add(new ArrayList<>(path));
return;
} for (String prev : from.get(cur)) {
path.offerFirst(prev);
dfs(path, from, prev, des);
path.pollFirst();
}
}
}

复杂度分析:略

BFS(三)单词接龙 ⅱ的更多相关文章

  1. 单词接龙(dragon)(BFS)

    单词接龙(dragon) 时间限制: 1 Sec  内存限制: 64 MB提交: 12  解决: 5[提交][状态][讨论版] 题目描述 单 词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已 ...

  2. Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)

    Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  3. Noip2000 T3 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  4. 洛谷 P1019 单词接龙 Label:dfs

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  5. NOIP2000 单词接龙

    题三.  单词接龙                (27分)    问题描述    单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的 ...

  6. 洛谷 P1019 单词接龙【经典DFS,温习搜索】

    P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在 ...

  7. [openjudge-搜索]单词接龙

    题目描述 描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙&q ...

  8. 洛谷P1019:单词接龙(DFS)

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  9. 蓝桥杯—ALGO-18 单词接龙(DFS)

    问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, 要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次) ,在两个单词相连时,其 ...

  10. (洛谷)P1019 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

随机推荐

  1. k8s 自动扩缩容HPA原理及adapter配置详解👑

    大家好,我是蓝胖子,都知道,k8s拥有自动扩缩容机制HPA,我们能够通过配置针对不同的扩缩容场景进行自动扩缩容,往往初学者在面对其中繁多配置的时候会学了又忘记,今天我将会以一种不同的视角,结合api ...

  2. Top 5 Code Smells Newbies Developers Could Easily Identify & Avoid

    Posted by Ajitesh Kumar / In Freshers, Software Quality / February 1, 2014 Following is one very pop ...

  3. CF339D

    题目简化与分析: 题目翻译说的还是太复杂了,其实只是给你 $ n $ 个数,奇数位 \(\operatorname{or}\),偶数位 \(\operatorname{xor}\). 会修改某个元素 ...

  4. 详解.NET依赖注入中对象的创建与“销毁”

    在DI容器中注册类型,DI容器就可以帮我们创建类型的实例:如果注册类型实现了IAsyncDisposable或者IDisposable接口,对象销毁时DI容器还会帮我们调用DisposeAsync或D ...

  5. 模拟退火算法(SA)

    求某个目标函数的最值 爬山法 首先我们通过爬山法来引出模拟退火算法 我们先看一个例子:求函数的最值 我们用爬山法解决这个问题的步骤 1.在解空间中随机生成一个初始解(图中小黄点就是我们生成的初始解) ...

  6. 使用visualvm远程监控JVM

    参考:http://blog.sina.com.cn/s/blog_4e90b3ba0100muco.html 1.首先要修改JDK中JMX服务的配置文件,以获得相应的权限: 在jdk-1.6.0_2 ...

  7. powerdesigner 生成sql语言

    首先要确定的是自己已经准备好一个概念模型 在概念模型界面点击上方工具栏中的Tools->Generate logical data model.. 生成逻辑模型 同样的操作生成物理模型 Gene ...

  8. 避免defer陷阱:拆解延迟语句,掌握正确使用方法

    基本概念 Go语言的延迟语句defer有哪些特点?通常在什么情况下使用? Go语言的延迟语句(defer statement)具有以下特点: 延迟执行:延迟语句会在包含它的函数执行结束前执行,无论函数 ...

  9. 🔥🔥Java开发者的Python快速进修指南:控制之if-else和循环技巧

    简单介绍 在我们今天的学习中,让我们简要了解一下Python的控制流程.考虑到我们作为有着丰富Java开发经验的程序员,我们将跳过一些基础概念,如变量和数据类型.如果遇到不熟悉的内容,可以随时查阅文档 ...

  10. Python 中的单下划线和双下划线

    哈喽大家好,我是咸鱼 当我们在学习 Python 的时候,可能会经常遇到单下划线 _ 和双下划线 __ 这两种命名方式 单下划线 _ 和双下划线 __ 不仅仅是只是一种简单的命名习惯,它们在 Pyth ...