博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lintcode 单词接龙II
阅读量:6590 次
发布时间:2019-06-24

本文共 4110 字,大约阅读时间需要 13 分钟。

v题意

  给出两个单词(start和end)和一个字典,找出所有从start到end的最短转换序列

  比如:

    1、每次只能改变一个字母。

    2、变换过程中的中间单词必须在字典中出现。

v注意事项

  • 所有单词具有相同的长度。
  • 所有单词都只包含小写字母。

v样例

  给出数据如下:

  start = "hit"

  end = "cog"

  dict = ["hot","dot","dog","lot","log"]

  返回

  [

      ["hit","hot","dot","dog","cog"],

      ["hit","hot","lot","log","cog"]

    ]

 

v解题思路

  根据每两个单词是否只差一个字母,进行建图,然后如下。

  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
> findLadders(String start, String end, Set
dict) { // write your code here Map
> g = new HashMap<>(); Set
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
newList = new ArrayList<>(); g.put(first, newList); } g.get(first).add(second); if (!g.containsKey(second)) { List
newList = new ArrayList<>(); g.put(second, newList); } g.get(second).add(first); } } } resultMap = new HashMap<>(); visit = new HashSet<>();// return dfs(g, start, end);//超时了,不知道怎么优化 List
> result = new ArrayList<>(); dist = new HashMap<>(); dfs(result, new LinkedList
(), g, start, end, bfs(g, end, start)); return result; } //通过bfs计算 终结点 到 源结点 的最短转换长度,以及 终结点到各个结点的最短距离(在通过 dfs寻找 最短转换序列的时候用到) private Map
dist; private int bfs(Map
> g, String start, String end) { Queue
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
> result, List
tmp, Map
> 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); } @Deprecated private List
> dfs(Map
> g, String start, String end) { List
> result = new ArrayList<>(); if (start.equals(end)) { List
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
> nextResult = new ArrayList<>(); int minLen = Integer.MAX_VALUE; for (String next : g.get(start)) { if(visit.contains(next)) continue; List
> tmp = dfs(g, next, end); if (tmp != null) { for (List
list : tmp) { if(minLen > list.size()) minLen = list.size(); nextResult.add(list); } } } visit.remove(start); for (List
list : nextResult) { if (list.size() == minLen) { List
tmp = new LinkedList<>(list); tmp.add(0, start); result.add(tmp); } } if(result.size() > 0) { resultMap.put(start, result); } return result; } //记忆化搜索 每个节点到终点的最小步数的路径 private Map
>> resultMap; //每个节点的访问的情况 private Set
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; }}
本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/7327101.html,如需转载请自行联系原作者
你可能感兴趣的文章
Java8-Stream-No.12
查看>>
Java编译那些事儿【转】
查看>>
各种排序算法的总结
查看>>
[.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境【转】...
查看>>
SpringBoot相关
查看>>
[LeetCode] Sudoku Solver 求解数独
查看>>
html5/haXe开发偶感
查看>>
js深入研究之神奇的匿名函数类生成方式
查看>>
The life cycle of a typical project 一个典型的项目生命周期
查看>>
推荐F#最近的一些资源
查看>>
Linux文件操作
查看>>
ylbtech-Recode(记录)-数据库设计
查看>>
运动目标跟踪与检测的源代码(CAMSHIFT 算法)
查看>>
PHP工厂模式的简单实现
查看>>
线程同步中异常情况的处理
查看>>
Orchard模块开发全接触3:分类的实现及内容呈现(Display)
查看>>
JQuery 自动触发事件
查看>>
ylbtech-LanguageSamples-CommandLine(命令行参数)
查看>>
Uptime And Monitoring Strategies For Cloud-Based E-Commerce Applications/Websites
查看>>
FPGA未来几年的发展趋势及发展机遇
查看>>