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;}dict.remove(beginWord);// 第 1 步:广度优先遍历建图// 记录扩展出的单词是在第几次扩展的时候得到的,key:单词,value:在广度优先遍历的第几层Map<String, Integer> steps = new HashMap<>();steps.put(beginWord, 0);// 记录了单词是从哪些单词扩展而来,key:单词,value:单词列表,这些单词可以变换到 key ,它们是一对多关系Map<String, List<String>> from = new HashMap<>();int step = 1;boolean found = false;int wordLen = beginWord.length();Queue<String> queue = new LinkedList<>();queue.offer(beginWord);while (!queue.isEmpty()) {int size = queue.size();for (int i = 0; i < size; i++) {String currWord = queue.poll();char[] charArray = currWord.toCharArray();// 将每一位替换成 26 个小写英文字母for (int j = 0; j < wordLen; j++) {char origin = charArray[j];for (char c = 'a'; c <= 'z'; c++) {charArray[j] = c;String nextWord = String.valueOf(charArray);if (steps.containsKey(nextWord) && step == steps.get(nextWord)) {from.get(nextWord).add(currWord);}if (!dict.contains(nextWord)) {continue;}// 如果从一个单词扩展出来的单词以前遍历过,距离一定更远,为了避免搜索到已经遍历到,且距离更远的单词,需要将它从 dict 中删除dict.remove(nextWord);// 这一层扩展出的单词进入队列queue.offer(nextWord);// 记录 nextWord 从 currWord 而来from.putIfAbsent(nextWord, new ArrayList<>());from.get(nextWord).add(currWord);// 记录 nextWord 的 stepsteps.put(nextWord, step);if (nextWord.equals(endWord)) {found = true;}}charArray[j] = origin;}}step++;if (found) {break;}}// 第 2 步:深度优先遍历找到所有解,从 endWord 恢复到 beginWord ,所以每次尝试操作 path 列表的头部if (found) {Deque<String> path = new ArrayDeque<>();path.add(endWord);dfs(from, path, beginWord, endWord, res);}return res;}public void dfs(Map<String, List<String>> from, Deque<String> path, String beginWord, String cur, List<List<String>> res) {if (cur.equals(beginWord)) {res.add(new ArrayList<>(path));return;}for (String precursor : from.get(cur)) {path.addFirst(precursor);dfs(from, path, beginWord, precursor, res);path.removeFirst();}}
}

emmmm,人生最可贵的品质就是学会放弃,哇嘎嘎嘎

2021-06-14(126. 单词接龙 II)相关推荐

  1. Leetcode.126 单词接龙 II

    题目链接 Leetcode.126 单词接龙 II 题目描述 按字典 wordList完成从单词 beginWord到单词 endWord转化,一个表示此过程的 转换序列 是形式上像 beginWor ...

  2. LeetCode 126. 单词接龙 II(图的BFS)

    1. 题目 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列. 转换需遵循如下规则: 每次转换只能 ...

  3. leetcode 126. 单词接龙 II

    leetcode 126题 介绍 方法一 代码 Solution.java Test.java 方法二 算法介绍 在这个过程中需要注意的问题 代码 Solution.java Test.java 介绍 ...

  4. LeetCode 126 单词接龙 II

    题目描述 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则:每次转换只能改变一 ...

  5. 126. 单词接龙 II

    给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: 每次转换只能改变一个字母. ...

  6. LeetCode——126. 单词接龙 II

    概述 题目地址 题目不难理解,这里不需要额外解释 思路 首先 题目要求寻找最短转换序列,那么我们容易想到使用BFS BFS思路这里不再介绍 沿着BFS考虑代码编写,问题在于如何正确保存获取目标单词的路 ...

  7. 【每日刷题】单词接龙II

    题目地址 https://leetcode-cn.com/problems/word-ladder-ii/ 题目描述:单词接龙II 给定两个单词(beginWord 和 endWord)和一个字典 w ...

  8. 【题目14:单词接龙】

    题目描述: 单词接龙的规则是: 可用于接龙的单词,首字母必须要与前一个单词的尾字母相同: 当存在多个首字母相同的单词时,取长度最长的单词: 如果长度也相等,则取字典序最小的单词: 已经参与接龙的单词不 ...

  9. 【数据结构与算法】之深入解析“单词接龙II”的求解思路与算法示例

    一.题目要求 按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的转换序列是形式上像 beginWord -> s1 -> s2 -&g ...

最新文章

  1. 自相关矩阵和互相关矩阵的matlab实现
  2. VirtualBox更改默认路径
  3. tomcat4 请求的处理——初步分析
  4. MATLAB信号处理之连续时间系统的时域分析
  5. linux less从后向前查看日志信息
  6. Python网络爬虫第一弹《Python网络爬虫相关基础概念》
  7. 双android手机同步工具,手机同步软件Android Manager使用图文教程
  8. Adobe InDesign繁体字转简体字
  9. gofpdf 学习笔记
  10. 加扣扣群所有脚本免费使用
  11. 解决The number of method references in a .dex file cannot exceed 64K的问题
  12. 微信域名检测接口文档
  13. 华为RH2288V3服务器不重构RAID扩容磁盘方法
  14. SAS系统学习之初探
  15. 联想ideapad 330c 15Ikb换内存条注意!!!!!只有一个插槽
  16. suricata UT测试用例中使用的几个重要的辅助函数
  17. node.js 安装详细步骤
  18. Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.6 - 图生成 小世界模型
  19. Photoshop---Wacom手绘板绘画画变成了拖动,根本不能画画
  20. java注解检验集合对象_Java 对list对象进行属性校验

热门文章

  1. 基于C++的Mips模拟器设计
  2. oracle 数值向上取整,oracle数值函数
  3. 自己写了个魔兽显血改键工具
  4. mysql ini配置文件分组排序_Windows下的mysql获取my.ini配置文件位置的顺序
  5. 【快速统计面积周长】封闭图形快速面积求和CAD插件【LSP】
  6. Vscode 写作插件
  7. 如何用积分去管理和转化用户
  8. 在Linux下,SVN服务器的安装
  9. 单变量线性回归实验分析
  10. 玩美移动达成合并协议:拟纳斯达克上市 CCV是股东