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

    }
}

  

*运行结果

 

posted @ 2020-04-21 12:56  雪瞳  阅读(217)  评论(0编辑  收藏  举报