每日一题 为了工作 2020 0421 第五十题
/**
*
* 【问题】字符串转换路径问题
* 给定两个字符串,记为start和to,再给定一个字符串列表list,list中一定包含
* to,list中没有重复的字符串。所有字符串都是小写的。规定start每次只可以改
* 变一个字符,最终的目标是彻底变成to,但每次变成的字符串都必须在list中存在。
* 请返回最短的变换路径。
* 【举例】
* start = "abc"
* to = "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
* 【分析】
* 本题目难度较大,需要拆分成四个步骤进行实现,接下来完成第一步骤获取每一个
* 字符串的nexts信息。
*
* 【第二步】
* 有了每一个字符串的nexts信息之后,相当于我们有了一张图,每个字符串相当于
* 图上面的一个点,所有的nexts信息相当于这个点的所有邻接节点。
* 接下来从start字符串出发,利用nexts信息和宽度优先遍历的方式,求出每一个字符
* 到start字符串的最短距离。
* 从"abc"出发 生成的最短距离信息如下:
* 字符串 到start的最短距离
* abb 1
* acc 1
* cbb 2
* ccc 2
* abc 0
* aab 2
* cac 2
* cbc 1
* cab 3
*
* @author 雪瞳
* @Slogan 时钟尚且前行,人怎能再次止步!
* @Function 返回每一个字符串的最短距离信息
*
*/
public class GetDistances {
public HashMap<String,Integer> getDistances(String start, HashMap<String,ArrayList<String>> nexts){
//返回一个map集合 k 为当前字符串可到达的字符串 value是需要的距离
HashMap<String,Integer> distances = new HashMap<>(20);
distances.put(start,0);
//队列
Queue<String> queue = new LinkedList<>();
//起始元素
queue.add(start);
HashSet<String> set = new HashSet<>();
set.add(start);
//层层遍历找到每一个元素
while (!queue.isEmpty()){
String cur =queue.poll();
//根据当前字符串拿到其对应的nexts的节点元素
for (String str:nexts.get(cur)){
//避免重复
if (!set.contains(str)){
distances.put(str,distances.get(cur)+1);
queue.add(str);
set.add(str);
}
}
}
return distances;
}
public static void main(String[] args) {
String start = "abc";
List<String> list = new ArrayList<>();
String[] elements = new String[]{"cab","acc","cbc","ccc","cac","cbb","aab","abb"};
for (String elem : elements){
list.add(elem);
}
list.add(start);
GetNexts get = new GetNexts();
HashMap<String, ArrayList<String>> nexts = get.getNexts(list);
GetDistances distances = new GetDistances();
HashMap<String, Integer> result = distances.getDistances(start, nexts);
Set<Map.Entry<String, Integer>> entries = result.entrySet();
for (Map.Entry<String,Integer> entry : entries){
System.out.println(entry.getKey()+"----"+entry.getValue());
}
}
}
*运行结果


浙公网安备 33010602011771号