每日一题 为了工作 2020 0422 第五十一题
/**
* 【问题】字符串转换路径问题
* 给定两个字符串,记为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信息。
*
* 【第三步】
* 从start出发往下走,保证每走一步走到的字符串cur到start的最短距离都在加一,
* 如果能够走到to,则收集整条路。
* 如题设从"abc"出发,每一步都通过字符串的nexts信息往下走,但是必须保证到start
* 的最短距离是+1递增的。
* 整个过程是标准的深度优先遍历,往下走的过程中,因为有最短距离要不断+1递增的
* 限制,所以走的岔路不可能无穷尽的展开,也不可能形成环。
*
* @author 雪瞳
* @Slogan 时钟尚且前行,人怎能再此止步!
* @Function
*
*/
public class GetShortPath {
public void getShortPaths(String cur, String to, HashMap<String,ArrayList<String>> nexts,
HashMap<String,Integer> distanes, LinkedList<String> solution,
List<List<String>> res){
solution.add(cur);
if (to.equals(cur)){
res.add(new LinkedList<String>(solution));
}else {
for (String next:nexts.get(cur)){
if (distanes.get(next) == distanes.get(cur)+1){
getShortPaths(next, to, nexts, distanes, solution, res);
}
}
}
solution.pollLast();
}
}