2021-06-14(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;}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)相关推荐
- Leetcode.126 单词接龙 II
题目链接 Leetcode.126 单词接龙 II 题目描述 按字典 wordList完成从单词 beginWord到单词 endWord转化,一个表示此过程的 转换序列 是形式上像 beginWor ...
- LeetCode 126. 单词接龙 II(图的BFS)
1. 题目 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列. 转换需遵循如下规则: 每次转换只能 ...
- leetcode 126. 单词接龙 II
leetcode 126题 介绍 方法一 代码 Solution.java Test.java 方法二 算法介绍 在这个过程中需要注意的问题 代码 Solution.java Test.java 介绍 ...
- LeetCode 126 单词接龙 II
题目描述 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则:每次转换只能改变一 ...
- 126. 单词接龙 II
给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: 每次转换只能改变一个字母. ...
- LeetCode——126. 单词接龙 II
概述 题目地址 题目不难理解,这里不需要额外解释 思路 首先 题目要求寻找最短转换序列,那么我们容易想到使用BFS BFS思路这里不再介绍 沿着BFS考虑代码编写,问题在于如何正确保存获取目标单词的路 ...
- 【每日刷题】单词接龙II
题目地址 https://leetcode-cn.com/problems/word-ladder-ii/ 题目描述:单词接龙II 给定两个单词(beginWord 和 endWord)和一个字典 w ...
- 【题目14:单词接龙】
题目描述: 单词接龙的规则是: 可用于接龙的单词,首字母必须要与前一个单词的尾字母相同: 当存在多个首字母相同的单词时,取长度最长的单词: 如果长度也相等,则取字典序最小的单词: 已经参与接龙的单词不 ...
- 【数据结构与算法】之深入解析“单词接龙II”的求解思路与算法示例
一.题目要求 按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的转换序列是形式上像 beginWord -> s1 -> s2 -&g ...
最新文章
- 自相关矩阵和互相关矩阵的matlab实现
- VirtualBox更改默认路径
- tomcat4 请求的处理——初步分析
- MATLAB信号处理之连续时间系统的时域分析
- linux less从后向前查看日志信息
- Python网络爬虫第一弹《Python网络爬虫相关基础概念》
- 双android手机同步工具,手机同步软件Android Manager使用图文教程
- Adobe InDesign繁体字转简体字
- gofpdf 学习笔记
- 加扣扣群所有脚本免费使用
- 解决The number of method references in a .dex file cannot exceed 64K的问题
- 微信域名检测接口文档
- 华为RH2288V3服务器不重构RAID扩容磁盘方法
- SAS系统学习之初探
- 联想ideapad 330c 15Ikb换内存条注意!!!!!只有一个插槽
- suricata UT测试用例中使用的几个重要的辅助函数
- node.js 安装详细步骤
- Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.6 - 图生成 小世界模型
- Photoshop---Wacom手绘板绘画画变成了拖动,根本不能画画
- java注解检验集合对象_Java 对list对象进行属性校验