题意

  给出两个单词(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相关推荐

  1. Leetcode.126 单词接龙 II

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

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

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

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

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

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

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

  5. LeetCode 126 单词接龙 II

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

  6. 126. 单词接龙 II

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

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

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

  8. leetcode 126. 单词接龙 II

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

  9. 2021-06-14(126. 单词接龙 II)

    class Solution {public List<List<String>> findLadders(String beginWord, String endWord, ...

最新文章

  1. navicat for mysql注册码:NAVN-LNXG-XHHX-5NOO
  2. 解题报告——例题5-8 Unix is 命令(UVa 400)——26行代码解决
  3. pip 10.0.0 BUG 解决方案Traceback (most recent call last): File /usr/bin/pip3, line 9, in module...
  4. 【转】Linux C动态内存泄漏追踪方法
  5. ctrl z推出查看文本怎么结束_最实用的10个电脑常用快捷键!Ctrl+Z的鬼才反向了解一下!...
  6. MT艾宾浩斯背单词(附带主程序)
  7. b站主页面视频推荐油猴脚本(更新)
  8. java 关键字 val,java关键字final用法知识点
  9. 文件(夹)操作SHFileOperation (删除 复制 移动) 报错 无法读取源文件或磁盘
  10. 关灯游戏 Lights out (二)(首行枚举+位运算,搜索全部解)
  11. Python 爬虫案例(一)
  12. 超级高铁(Hyperloop)
  13. android视频播放框架Vitamio
  14. 安卓使用MediaPlayer播放视频
  15. node版本管理工具gnvm
  16. Java用数组实现队列和循环队列
  17. libusb函数说明
  18. 洛谷CF499B Lecture + 映射map
  19. 究竟什么是CRM(客户关系管理系统)呢?
  20. Transformer中引用iqd作为数据源的时候数据预览出现乱码

热门文章

  1. 使用计算机时什么是开机键什么是关机键,计算器上的开机键是关机键是
  2. 移动端H5 腾讯地图sdk 当前位置 地址你解析 距离计算
  3. 第四章、项目整合管理【PMP】
  4. 工作流实战_21_flowable 加签 任务向前加签 向后加签
  5. GitHub下载文件时缓慢的问题
  6. 第8篇:Flowable-Modeler集成之Flowable-modeler源码编译
  7. ssh连接远程linux环境
  8. 前端详细设计文档怎么写_UI设计师简历应该怎么写?
  9. C语言 数组指针 - C语言零基础入门教程
  10. php语句结束标记,PHP结束标记“?”