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

      

    *运行结果

  • 相关阅读:
    201671010424马玉琴实验四结对项目的互评
    201671010424马玉琴《 英文文本统计》 结对项目
    201671010424马玉琴实验二词频统计软件项目
    201671010424马玉琴 实验三作业互评与改进报告
    读构建之法后提问。
    201671010425邱世妍 团队评审&课程总结
    201671010425-邱世妍 第四次试验互评
    《英文文本统计分析》结对项目报告
    201671010425-邱世妍 词频统计软件项目报告
    201671010425-邱世妍 作业互评与改进报告
  • 原文地址:https://www.cnblogs.com/walxt/p/12743829.html
Copyright © 2020-2023  润新知