zoukankan      html  css  js  c++  java
  • leetcode 5199. 交换字符串中的元素

    地址  https://leetcode-cn.com/contest/weekly-contest-155/problems/smallest-string-with-swaps/

    给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。

    你可以 任意多次交换 在 pairs 中任意一对索引处的字符。

    返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。

    示例 1:
    
    输入:s = "dcab", pairs = [[0,3],[1,2]]
    输出:"bacd"
    解释: 
    交换 s[0] 和 s[3], s = "bcad"
    交换 s[1] 和 s[2], s = "bacd"
    示例 2:
    
    输入:s = "dcab", pairs = [[0,3],[1,2],[0,2]]
    输出:"abcd"
    解释:
    交换 s[0] 和 s[3], s = "bcad"
    交换 s[0] 和 s[2], s = "acbd"
    交换 s[1] 和 s[2], s = "abcd"
    示例 3:
    
    输入:s = "cba", pairs = [[0,1],[1,2]]
    输出:"abc"
    解释:
    交换 s[0] 和 s[1], s = "bca"
    交换 s[1] 和 s[2], s = "bac"
    交换 s[0] 和 s[1], s = "abc"

    这个使用的并查集用来解决 在一类的索引查找

    后面字符串的排序和索引排序 需要注意下

    class Solution {
    public:
        int p[100010] = {-1}; //存储每个点的祖宗节点
    
        // 返回x的祖宗节点
        int find(int x)
        {
            if (p[x] != x) p[x] = find(p[x]);
            return p[x];
        }
        
        string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
            for (int i = 0; i <= s.size(); i ++ ) p[i] = i;
            for(int i = 0; i  < pairs.size();i++){
                int a = pairs[i][0];
                int b = pairs[i][1];
                p[find(a)] = find(b);
            }
            
            //================================
            int n = s.size();
            vector<vector<int>> idx(n);
            vector<string> ss(n);
            
            for(int i = 0; i < n;i++){
                int id = find(i);
                idx[id].push_back(i);
                ss[id].push_back(s[i]);
            }
            
            for(int i =0; i < n;i++){
                sort(ss[i].begin(),ss[i].end());
                for(int k = 0;k < idx[i].size();k++){
                    s[idx[i][k]] = ss[i][k];
                }
            }
            
            
            
            return s;
        }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    LeetCode 977 有序数组的平方
    LeetCode 24 两两交换链表中的节点
    LeetCode 416 分割等和子集
    LeetCode 142 环形链表II
    LeetCode 106 从中序与后序遍历序列构造二叉树
    LeetCode 637 二叉树的层平均值
    LeetCode 117 填充每个节点的下一个右侧节点
    LeetCode 75 颜色分类
    redhat 7.4 挂载ntfs格式的u盘并且使用
    redhat 查看CPU frequency scaling(CPU频率缩放)
  • 原文地址:https://www.cnblogs.com/itdef/p/11605194.html
Copyright © 2011-2022 走看看