每日一题 为了工作 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();
    }
}

  

猜你喜欢

转载自www.cnblogs.com/walxt/p/12755616.html