lintcode 单词接龙II
题意
给出两个单词(start和end)和一个字典,找出所有从start到end的最短转换序列
比如:
1、每次只能改变一个字母。
2、变换过程中的中间单词必须在字典中出现。
注意事项
- 所有单词具有相同的长度。
- 所有单词都只包含小写字母。
样例
给出数据如下:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]
返回
[
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]
解题思路
根据每两个单词是否只差一个字母,进行建图,然后如下。
1.深搜 + 回溯 + 记忆化(记录每个节点到 终结点 的最短转换序列),超时啦。。。
2.通过广搜 计算出终结点到各个节点的最短距离(包括源节点到终结点的最短距离,也就是和 最短转换序列的长度对应)
public class Solution {/*** @param start, a string* @param end, a string* @param dict, a set of string* @return a list of lists of string*/public List<List<String>> findLadders(String start, String end, Set<String> dict) {// write your code hereMap<String, List<String>> g = new HashMap<>();Set<String> words = new HashSet<>(dict);words.add(start);words.add(end);String[] wordArray = words.toArray(new String[0]);for (int i = 0; i < wordArray.length - 1; ++i) {for (int j = i + 1; j < wordArray.length; ++j) {String first = wordArray[i], second = wordArray[j];if (this.wordDiffCnt(first, second) == 1) {if (!g.containsKey(first)) {List<String> newList = new ArrayList<>();g.put(first, newList);}g.get(first).add(second);if (!g.containsKey(second)) {List<String> newList = new ArrayList<>();g.put(second, newList);}g.get(second).add(first);}}}resultMap = new HashMap<>();visit = new HashSet<>();// return dfs(g, start, end);//超时了,不知道怎么优化 List<List<String>> result = new ArrayList<>();dist = new HashMap<>();dfs(result, new LinkedList<String>(), g, start, end, bfs(g, end, start));return result;}//通过bfs计算 终结点 到 源结点 的最短转换长度,以及 终结点到各个结点的最短距离(在通过 dfs寻找 最短转换序列的时候用到)private Map<String, Integer> dist;private int bfs(Map<String, List<String>> g, String start, String end) {Queue<String> queue = new LinkedList<>();visit.add(start);queue.add(start);dist.put(start, 1);int minLen = 0;while(!queue.isEmpty()) {start = queue.poll();if(start.equals(end)) {if(minLen == 0) {minLen = dist.get(start);}}if(g.containsKey(start)) {for (String next : g.get(start)) {if(visit.contains(next)) continue;visit.add(next);queue.add(next);dist.put(next, dist.get(start)+1);}}}visit.clear();return minLen;}private void dfs(List<List<String>> result, List<String> tmp, Map<String, List<String>> g, String start, String end, int minLen) {if(tmp.size()+dist.get(start)-1 >= minLen) return;if (start.equals(end)) {result.add(new ArrayList<>(tmp));result.get(result.size() - 1).add(end);return;}visit.add(start);tmp.add(start);if (g.containsKey(start)) {for (String next : g.get(start)) {if(visit.contains(next)) continue;dfs(result, tmp, g, next, end, minLen);}}visit.remove(start);tmp.remove(tmp.size()-1);}@Deprecatedprivate List<List<String>> dfs(Map<String, List<String>> g, String start, String end) {List<List<String>> result = new ArrayList<>();if (start.equals(end)) {List<String> list = new ArrayList<>();list.add(end);result.add(list);resultMap.put(end, result);return result;}if (resultMap.containsKey(start)) {return resultMap.get(start);}if (!g.containsKey(start)) {resultMap.put(start, null);return null;}visit.add(start);List<List<String>> nextResult = new ArrayList<>();int minLen = Integer.MAX_VALUE;for (String next : g.get(start)) {if(visit.contains(next)) continue;List<List<String>> tmp = dfs(g, next, end);if (tmp != null) {for (List<String> list : tmp) {if(minLen > list.size()) minLen = list.size();nextResult.add(list);}}}visit.remove(start);for (List<String> list : nextResult) {if (list.size() == minLen) {List<String> tmp = new LinkedList<>(list);tmp.add(0, start);result.add(tmp);}}if(result.size() > 0) {resultMap.put(start, result);}return result;}//记忆化搜索 每个节点到终点的最小步数的路径private Map<String, List<List<String>>> resultMap;//每个节点的访问的情况private Set<String> visit;private int wordDiffCnt(String s1, String s2) {int diffCnt = 0;for (int i = 0; i < s1.length(); ++i) {if (s1.charAt(i) != s2.charAt(i)) {++diffCnt;}}return diffCnt;} }
转载于:https://www.cnblogs.com/hujunzheng/p/7327101.html
lintcode 单词接龙II相关推荐
- Leetcode.126 单词接龙 II
题目链接 Leetcode.126 单词接龙 II 题目描述 按字典 wordList完成从单词 beginWord到单词 endWord转化,一个表示此过程的 转换序列 是形式上像 beginWor ...
- 【每日刷题】单词接龙II
题目地址 https://leetcode-cn.com/problems/word-ladder-ii/ 题目描述:单词接龙II 给定两个单词(beginWord 和 endWord)和一个字典 w ...
- LeetCode 126. 单词接龙 II(图的BFS)
1. 题目 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列. 转换需遵循如下规则: 每次转换只能 ...
- 【数据结构与算法】之深入解析“单词接龙II”的求解思路与算法示例
一.题目要求 按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的转换序列是形式上像 beginWord -> s1 -> s2 -&g ...
- LeetCode 126 单词接龙 II
题目描述 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则:每次转换只能改变一 ...
- 126. 单词接龙 II
给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: 每次转换只能改变一个字母. ...
- LeetCode——126. 单词接龙 II
概述 题目地址 题目不难理解,这里不需要额外解释 思路 首先 题目要求寻找最短转换序列,那么我们容易想到使用BFS BFS思路这里不再介绍 沿着BFS考虑代码编写,问题在于如何正确保存获取目标单词的路 ...
- leetcode 126. 单词接龙 II
leetcode 126题 介绍 方法一 代码 Solution.java Test.java 方法二 算法介绍 在这个过程中需要注意的问题 代码 Solution.java Test.java 介绍 ...
- 2021-06-14(126. 单词接龙 II)
class Solution {public List<List<String>> findLadders(String beginWord, String endWord, ...
最新文章
- navicat for mysql注册码:NAVN-LNXG-XHHX-5NOO
- 解题报告——例题5-8 Unix is 命令(UVa 400)——26行代码解决
- pip 10.0.0 BUG 解决方案Traceback (most recent call last): File /usr/bin/pip3, line 9, in module...
- 【转】Linux C动态内存泄漏追踪方法
- ctrl z推出查看文本怎么结束_最实用的10个电脑常用快捷键!Ctrl+Z的鬼才反向了解一下!...
- MT艾宾浩斯背单词(附带主程序)
- b站主页面视频推荐油猴脚本(更新)
- java 关键字 val,java关键字final用法知识点
- 文件(夹)操作SHFileOperation (删除 复制 移动) 报错 无法读取源文件或磁盘
- 关灯游戏 Lights out (二)(首行枚举+位运算,搜索全部解)
- Python 爬虫案例(一)
- 超级高铁(Hyperloop)
- android视频播放框架Vitamio
- 安卓使用MediaPlayer播放视频
- node版本管理工具gnvm
- Java用数组实现队列和循环队列
- libusb函数说明
- 洛谷CF499B Lecture + 映射map
- 究竟什么是CRM(客户关系管理系统)呢?
- Transformer中引用iqd作为数据源的时候数据预览出现乱码
热门文章
- 使用计算机时什么是开机键什么是关机键,计算器上的开机键是关机键是
- 移动端H5 腾讯地图sdk 当前位置 地址你解析 距离计算
- 第四章、项目整合管理【PMP】
- 工作流实战_21_flowable 加签 任务向前加签 向后加签
- GitHub下载文件时缓慢的问题
- 第8篇:Flowable-Modeler集成之Flowable-modeler源码编译
- ssh连接远程linux环境
- 前端详细设计文档怎么写_UI设计师简历应该怎么写?
- C语言 数组指针 - C语言零基础入门教程
- php语句结束标记,PHP结束标记“?”