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

相关内容

热门资讯

修改工具教程版!英雄斗地主智能... 英雄斗地主这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这款...
修改工具教程版!仙界道游智能插... 修改工具教程版!仙界道游智能插件是真的,分享详细开挂攻略一、仙界道游AI软件牌型概率发牌机制”必胜“...
修改工具教程版!浙江闲乐十三水... 修改工具教程版!浙江闲乐十三水智能插件是真的,分享详细开挂攻略一、浙江闲乐十三水AI软件牌型概率发牌...
修改工具教程版!闲易智能插件是... 亲,闲易这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,闲易的开挂软件,名称叫闲易...
修改工具教程版!新胜麻将智能插... 您好,新胜麻将这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
修改工具教程版!筑志红中麻将智... 亲,筑志红中麻将这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,筑志红中麻将的开挂...
修改工具教程版!鼎盛休闲智能插... 修改工具教程版!鼎盛休闲智能插件是真的,分享详细开挂攻略;原来确实真的有挂(需添加指定薇719890...
修改工具教程版!胡乐邯郸麻将智... 胡乐邯郸麻将这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这...
修改工具教程版!么么棋牌智能插... 修改工具教程版!么么棋牌智能插件是真的,分享详细开挂攻略;原来确实真的有挂(需添加指定薇719890...
修改工具教程版!飞鱼智能插件是... 您好,飞鱼这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打牌都...
修改工具教程版!猫猫学数智能插... 猫猫学数这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这款游...
修改工具教程版!梧桐树智能插件... 梧桐树这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这款游戏...
修改工具教程版!凌龙棋牌智能插... 修改工具教程版!凌龙棋牌智能插件是真的,分享详细开挂攻略是一款可以让一直输的玩家,快速成为一个“必胜...
修改工具教程版!随便玩红拐弯智... 您好:随便玩红拐弯确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都...
修改工具教程版!如意智能插件是... 如意这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这款游戏中...
修改工具教程版!欢乐二七十智能... 修改工具教程版!欢乐二七十智能插件是真的,分享详细开挂攻略1、让任何用户在无需AI插件第三方神器的情...
修改工具教程版!老铁十三水智能... 修改工具教程版!老铁十三水智能插件是真的,分享详细开挂攻略是一款可以让一直输的玩家,快速成为一个“必...
修改工具教程版!牵手长沙棋牌智... 修改工具教程版!牵手长沙棋牌智能插件是真的,分享详细开挂攻略一、牵手长沙棋牌AI软件牌型概率发牌机制...
修改工具教程版!微乐浙江麻将智... 您好:微乐浙江麻将确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都...
修改工具教程版!乐虎棋牌智能插... 乐虎棋牌这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这款游...