字符串的转换路径问题
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);}

相关内容

热门资讯

下载工资软件安卓系统,高效便捷... 你有没有想过,每个月的工资一到手,是不是就感觉整个人都轻松了呢?但是,你知道怎么轻松地管理你的工资吗...
下载灰灰影音安卓系统,畅享高清... 你有没有想过,一部手机,一部电脑,就能让你随时随地享受高清电影、热门剧集的乐趣?没错,这就是我们今天...
安卓系统是不是中国,中国智慧与... 你有没有想过,那个陪伴你每天刷手机、玩游戏、办公的安卓系统,它是不是中国的“孩子”呢?这个问题听起来...
电脑如果安装安卓系统,探索安卓... 你有没有想过,如果家里的电脑突然决定要换换口味,不再坚守Windows的阵营,而是拥抱安卓系统呢?想...
安卓手机升级苹果系统,体验全新... 你有没有想过,你的安卓手机突然间变成了苹果的忠实粉丝,想要体验一番iOS系统的魅力呢?这可不是天方夜...
安卓系统短信不通知,享受宁静 你是不是也遇到了这个问题?安卓系统短信不通知,是不是让你抓狂?别急,今天就来给你详细解析一下这个让人...
夏普电视非安卓系统,非安卓系统... 亲爱的读者们,你是否曾对夏普电视的非安卓系统感到好奇呢?今天,就让我带你一探究竟,揭开这个神秘面纱背...
安卓系统43适配软件,软件升级... 你有没有发现,你的安卓手机最近是不是有点儿“水土不服”?别急,别急,让我来给你揭秘为什么你的安卓系统...
安卓系统有车载系统吗吗,智能驾... 你有没有想过,当你坐在车里,享受着旅途的悠闲时光,手机上的安卓系统是不是也能派上用场呢?没错,我就要...
安卓8.1系统解锁方法,畅享自... 你有没有想过,你的安卓手机里隐藏着无数的小秘密?比如,解锁安卓8.1系统,就能让你的手机焕发出全新的...
安卓系统怎么打开邮件,安卓系统... 你有没有想过,每天那么多邮件,怎么才能快速打开它们呢?尤其是当你用的是安卓系统手机的时候。别急,今天...
封闭安卓系统安装软件,一步到位... 你有没有想过,为什么你的安卓手机里有些软件只能通过官方渠道安装呢?今天,就让我带你一探究竟,揭开封闭...
小米mipad升级安卓系统,解... 你有没有发现,最近小米Mipad的安卓系统升级可是个大热门呢!这不,我就迫不及待地来和你聊聊这个话题...
哪个安卓系统体验好,揭秘安卓系... 你有没有想过,手机里的安卓系统就像是个大厨,不同的版本就是不同的拿手好菜,有的让你回味无穷,有的却让...
安卓系统开发测试,全方位技术解... 你有没有想过,那个陪伴你每天刷手机、玩游戏、办公的安卓系统,是怎么从无到有,一步步成长起来的呢?今天...
安卓系统怎么查配置,轻松掌握设... 你有没有想过,你的安卓手机里藏着多少秘密?别小看这些配置信息,它们可是了解你手机性能的“小侦探”呢!...
pve下安装安卓系统,PVE环... 你有没有想过,在你的PVE服务器上安装一个安卓系统呢?听起来是不是有点酷炫?想象你的服务器不仅能够运...
安卓手机安装虹膜系统,安卓手机... 你有没有想过,你的安卓手机还能这样玩?没错,就是安装虹膜系统!听起来是不是有点酷炫?别急,让我带你一...
小米论坛原生安卓系统,深度解析... 你有没有想过,你的手机系统其实可以更加纯粹、更加原生?今天,就让我带你走进小米论坛,一探究竟,看看那...
安卓怎么装iphone系统,轻... 你是不是也和我一样,对安卓手机上的iPhone系统充满了好奇?想象那流畅的界面、强大的性能,还有那独...