zoukankan      html  css  js  c++  java
  • 1202. 交换字符串中的元素-并查集

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.PriorityQueue;
    import java.util.Queue;
    
    public class test1202 {
        /**
         * 给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。
    你可以 任意多次交换 在 pairs 中任意一对索引处的字符。
    返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。
         */
        public static void main(String[] args) {
            String s="dcab";
            List<List<Integer>> pairs=new ArrayList<>();
            List<Integer> list=new ArrayList<>();
            list.add(0);
            list.add(3);
            pairs.add(new ArrayList<>(list));
            list.clear();
            list.add(1);
            list.add(2);
            pairs.add(new ArrayList<>(list));
            String result=smallestStringWithSwaps(s, pairs);
            int x=0;
        }
        //使用并查集,所谓并查集就是把pair中起点或者终点相同的元素放在一起,并查集内部排序,之后组合就好
        public static String smallestStringWithSwaps(String s, List<List<Integer>> pairs) {
            int []parents=new int[s.length()];
            //初始化每个位置的parent都是他自己
            for(int i=0;i<s.length();i++){
                parents[i]=i;
            }
            //pair中两个点在一个阵营
            for(List<Integer> list:pairs){
                int a=find(list.get(0),parents);
                int b=find(list.get(1),parents);
                parents[a]=b;
            }
            //每个的父节点做key,优先队列里面放对应的char,这样每个parent对应的并查集就排好序了
            Map<Integer,Queue<Character>> map=new HashMap<>();
            for(int i=0;i<s.length();i++){
                int an=find(i,parents);
                map.computeIfAbsent(an, k->new PriorityQueue<>()).offer(s.charAt(i));
            }
            //最后合并起来,得到交换后的结果
            StringBuilder stringBuilder = new StringBuilder();
            for(int i=0;i<s.length();i++){
                Queue q=map.get(find(i,parents));
                stringBuilder.append(q.poll());
            }
    
            return stringBuilder.toString();
        }
        //查找祖宗节点,只有当前的值等于他父亲节点时候,才是祖宗节点
        public static int find(int i,int []parent){
            if(parent[i]!=i){
                ////如果不是祖宗节点就继续往上查找
                parent[i]=find(parent[i],parent);
            }
            return parent[i];
        }
    
    
        
    }
  • 相关阅读:
    iframe自适应高度的多种方法方法
    [tomcat][mysql][JDK][maven][myEclipse][ubuntu][centOs][oracle]等下载地址整理
    解决电脑速度越来越慢的方法
    li:hover 上再IE6下就没有效果的解决方法
    各种常用文件后缀名详解
    ASP.net中网站访问量统计方法
    RabbbitMQ的配置 以在.NetCore 的CAP 使用RabbbitMQ 实现订阅与发布问题
    .netCore 根据模型生成数据库
    jsonp Ajax跨域请求
    IE8 placeholder兼容+Password兼容
  • 原文地址:https://www.cnblogs.com/jieyi/p/14264777.html
Copyright © 2011-2022 走看看