字符串的转换路径问题
admin
2024-01-21 07:10:44
0

问题描述

        给定两个字符串,记为start和to,再给定一个字符串列表list,list中一定包含to list中没有重复字符串,所有的字符串都是小写的。
        规定: start每次只能改变一个字符,最终的目标是彻底变成to,但是每次变成的新字符串必须在list 中存在。
        请返回所有最短的变换路径。
【举例】
        start="abc",end="cab",list={"cab","acc","cbc","ccc","cac","cbb","aab","abb"}
        转换路径的方法有很多种,但所有最短的转换路径如下:
                abc -> abb -> aab -> cab
                abc -> abb -> cbb -> cab
                abc -> cbc -> cac -> cab
                abc -> cbc -> cbb -> cab

 思路

思路一:

        我们建立一个邻居表,邻居的定义是:一个字符串通过改变一个字符就可以变成另一个字符串,那么另一个字符串就是这个字符的邻居。我们遍历每一个字符串查看后面的字符是否是当前字符串的邻居,即可得到我们需要的邻居表。邻居表的建立需要的时间复杂度为:O(N^2),我们在遍历当前的字符串就可以得到本题答案,算法的整体时间复杂度为:O(N^2*K),其中K表示字符串的长度。

思路二:

        同样建立邻居表,不过同思路以不同的。我们把给定的字符串列表list全部放在一个hashmap中,由于本题中通过hashmap查找指定字符串时不能忽略字符串的长度,所以查找字符串的时间复杂度由原来的O(1)转变为O(K)。根据题目我们知道所有的字符串都是小写的所以每个字符的变化只有24种,我们列出开始字符串邻居的所有可能性(时间复杂度为:O(25*k)),在hashmap中查看是否有这种情况的邻居即可。整体的时间复杂度为O(K^2)。

        我们还需要建立距离表,其含义是该字符串到开始字符串的距离是多少。

  • 我们可以提前预处理出 start 和 list 中的每个字符串变换后的可能的下一个字符串,并根据这个建图
  • BFS 找出 start 到 to 的最短路径(注意:找到最短路径不要提前退出,需要把所有状态都处理掉,后面会用到)
  • 根据第二步的结果和状态之间的距离关系,DFS 搜索路径(重要:根据第二步的状态可大大减少搜索状态)
  • 将路径变换成字符串,并按照字典序从小到大排序并输出 

代码

        这里我们演示思路二的代码 

    public static List> findMinPaths(String start, String end, List list) {list.add(start);HashMap> nexts = getNexts(list);HashMap distances = getDistances(start, nexts);LinkedList pathList = new LinkedList<>();List> res = new ArrayList<>();getShortestPaths(start, end, nexts, distances, pathList, res);return res;}public static HashMap> getNexts(List words) {Set dict = new HashSet<>(words);HashMap> nexts = new HashMap<>();for (int i = 0; i < words.size(); i++) {nexts.put(words.get(i), getNext(words.get(i), dict));}return nexts;}public static ArrayList getNext(String word, Set dict) {ArrayList res = new ArrayList<>();char[] chs = word.toCharArray();for (char cur = 'a'; cur <= 'z'; cur++) {for (int i = 0; i < chs.length; i++) {if (chs[i] != cur) {char tmp = chs[i];chs[i] = cur;if (dict.contains(String.valueOf(chs))) {res.add(String.valueOf(chs));}chs[i] = tmp;}}}return res;}public static HashMap getDistances(String start,HashMap> nexts) {HashMap distances = new HashMap<>();distances.put(start, 0);Queue queue = new LinkedList<>();queue.add(start);HashSet set = new HashSet<>();set.add(start);while (!queue.isEmpty()) {String cur = queue.poll();for (String next : nexts.get(cur)) {if (!set.contains(next)) {distances.put(next, distances.get(cur) + 1);queue.add(next);set.add(next);}}}return distances;}private static void getShortestPaths(String cur, String to,HashMap> nexts,HashMap distances,LinkedList path,List> res) {path.add(cur);if (to.equals(cur)) {res.add(new LinkedList(path));} else {for (String next : nexts.get(cur)) {if (distances.get(next) == distances.get(cur) + 1) {getShortestPaths(next, to, nexts, distances, path, res);}}}path.pollLast();}public static void main(String[] args) {String start = "abc";String end = "cab";String[] test = {"cab", "acc", "cbc", "ccc", "cac", "cbb", "aab", "abb"};ArrayList list = new ArrayList<>();for (int i = 0; i < test.length; i++) {list.add(test[i]);}List> res = findMinPaths(start, end, list);System.out.println(res);}

相关内容

热门资讯

安卓未激活怎么激活系统,畅享智... 亲爱的安卓用户们,你是否在某个瞬间突然发现,你的安卓设备竟然未激活系统?别急,别慌,今天就来手把手教...
安卓系统车载音乐怎么调,轻松享... 你有没有发现,现在很多车都搭载了安卓系统,开车的时候听听音乐,简直是一种享受。但是,有些小伙伴可能还...
java获取安卓系统存储目录,... 你有没有想过,你的安卓手机里那些可爱的应用,它们是怎么知道该把文件存放在哪个角落的呢?今天,就让我带...
安卓新系统桌面整理软件,焕新体... 你有没有发现,随着安卓新系统的更新,手机桌面越来越乱啦?各种图标、文件夹,还有那些时不时跳出来的小通...
安卓手机有哪些系统版本,从初代... 你有没有发现,你的安卓手机每次更新系统时,都会带来一些新鲜感呢?不过,你知道你的手机到底有哪些系统版...
路畅导航是安卓系统,安卓系统下... 你有没有发现,现在出门在外,手机导航简直成了我们的“小保镖”?而在这众多导航软件中,路畅导航在安卓系...
deepin系统无法启动安卓应... 最近是不是你也遇到了这样的烦恼?你的Deepin系统突然间就无法启动安卓应用了,是不是感觉心里有点慌...
安卓系统解图案锁,安卓系统解锁... 手机解锁,这可是每天都要经历的小环节,是不是有时候觉得图案锁太复杂了,解起来有点头疼?别急,今天就来...
原生安卓系统用什么杀毒,探索最... 亲爱的安卓用户,你是否在为手机的安全问题而烦恼?尤其是那些坚持使用原生安卓系统的朋友们,你们知道用什...
车机改安卓系统,从传统到安卓智... 你有没有发现,最近你的车机系统好像变得不一样了?没错,就是那个一直默默陪伴你的车载系统,它悄悄地换上...
楼兰宝盒安卓系统,安卓系统下的... 你有没有听说过那个神秘的楼兰宝盒安卓系统?它就像一个穿越时空的魔法盒子,里面藏着无数惊喜和秘密。今天...
锤子系统属于安卓系统吗,深入解... 锤子系统,这个名字听起来是不是有点神秘又带点科技感?今天,就让我带你一探究竟,揭开锤子系统是否属于安...
安卓应该用什么系统,基于安卓系... 你有没有想过,你的安卓手机到底应该用哪个系统呢?这可是个让人头疼的问题,因为市面上有各种各样的系统,...
创维安卓4.0系统刷机,轻松升... 你有没有想过,你的创维安卓4.0系统是不是已经有点儿“老态龙钟”了呢?别急,今天就来给你支个招——刷...
开发版miui安卓系统,探索开... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是小米的MIUI系统又推出了新的开发版!安卓系统爱...
安卓动态系统组件名称是,构建灵... 你知道吗?在安卓这个庞大的生态系统中,有一个特别的存在,它就像是一个默默无闻的幕后英雄,每天都在为我...
安卓系统板开发板,探索创新与技... 你有没有想过,手机里的安卓系统其实是由一块小小的板子支撑起来的?没错,这就是安卓系统板开发板,今天就...
学生选课管理系统安卓,便捷高效... 你有没有想过,选课对于学生来说,简直就像是一场大型的迷宫挑战?不过别担心,现在有了学生选课管理系统安...
测绘官网系统下载安卓,测绘官网... 你有没有想过,在这个信息爆炸的时代,想要找到一款好用的测绘软件,竟然也能成为一种挑战?别急,今天我就...
安卓无纸化信息管理系统,打造高... 你知道吗?在这个信息爆炸的时代,无纸化办公已经成为了许多企业和机构的追求。而安卓无纸化信息管理系统,...