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

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

题意

  给出两个单词(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
> 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://edwao.baihongyu.com/

你可能感兴趣的文章
surfaceView和Camera配合进行摄像头的预览
查看>>
date和long的相互转换
查看>>
剑指Offer 05 替换空格
查看>>
保持控件和容器之间的相对位置
查看>>
转:session和cookie以及catch三者的区别
查看>>
20060908: 天极网谴责百度
查看>>
单链表
查看>>
第八章 蜂鸣器驱动
查看>>
CDOJ 31 饭卡(card) 解题报告
查看>>
关于Azure Auto Scale的高级属性配置
查看>>
css基础3
查看>>
PHP面试专用笔记精简版
查看>>
关于微信的禁用右上角
查看>>
linux降级重新安装gcc
查看>>
pythonweb服务器编程(三)
查看>>
属性(@property)、@synthesize
查看>>
maven学习(2)-在Eclipse 中使用Maven
查看>>
golang在gitlab中的工作流
查看>>
bash脚本编程
查看>>
Bzoj3626 [LNOI2014]LCA
查看>>