【算法】交换交换字符串中的元素-并查集

六月集训(第26天) —— 并查集 第26天 - 并查集 阅读详情

2021-05-19

问题描述

给你一个字符串 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”

分析

审题可以发现,pairs是给定的成对的可交换的位置。另外,如果两对可交换的集合有交集的话,例如[1, 2]和[2, 3],那么下标为1、2、3的三个数可以交换成任意顺序,自然就可以交换得到这三个字符能够组成的字典序最小的字符串。那么多几对都有交集的情况呢?通过观察也是这样的,所以我们可以通过并查集的方法,来将这些索引对看成是集合,有交集的可以联通在一起,通过并查集将它们有交集的归为一个集合。假设得到三个集合,我们只需要分别对三个集合排序(使用优先队列)就可以了,最后从下标0开始遍历,每次取该下标所属集合的最小的那个字符即可,选取后同时将其从该集合的优先队列中弹出。

class Solution {
    // 并查集
    int[] pre;
    public String smallestStringWithSwaps(String s, List<List<Integer>> pairs) {
        if (pairs.size() == 0)
            return s;
        int len = s.length();
        pre = new int[len];
        for (int i = 0; i < len; i++) {
            pre[i] = i;
        }
        // 使用并查集进行划分
        for (int i = 0; i < pairs.size(); i++) {
            union(pairs.get(i).get(0), pairs.get(i).get(1));
        }
        // 并查集中每个集合都有个root,将该集合中的字符通过优先队列进行排序
        Map<Integer, PriorityQueue<Character>> map = new HashMap<>();
        for (int i = 0; i < len; i++) {
            int root = find(i);
            if (map.containsKey(root)) {
                map.get(root).offer(s.charAt(i));
            } else {
                PriorityQueue<Character> heap = new PriorityQueue<>();
                heap.offer(s.charAt(i));
                map.put(root, heap);
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < len; i++) {
            int root = find(i);
            sb.append(map.get(root).poll());
        }
        return sb.toString();
    }
    public int find(int root) {
        if (pre[root] == root) {
            return root;
        }
        return pre[root] = find(pre[root]);
    }
    public void union(int a, int b) {
        int x = find(a);
        int y = find(b);
        if (x != y) {
            pre[x] = y;
        }
    }
}
leetcode之并查集+记忆化搜索+回溯+最小生成树刷题总结1 leetcode之并查集+记忆化搜索+回溯+最小生成树刷题总结1 1-连接所有点的最小费用 题目连接:题目连接戳这里!!! 思路:cruskal+并查集 根据题意,我们得到了一张 n 个节点的完全图,任意两点之间的距离均为它们的曼哈顿距离。现在我们需要在这个图中取得一个子图,恰满足子图的任意两点之间有且仅有一条简单路径,且这个子图的所有边的总权值之和尽可能小。能够满足任意两点之间有且仅有一条简单路径只有树,且这棵树包含 n 个节点。我们称这棵树为给定的图的生成树,其中总权值最小的生成树,我们称其为最小生成树 阅读详情

相关推荐

【C++并集查找 图论】1202. 交换字符串中的元素|1855

给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。 你可以 任意多次交换 在 pairs 中任意一对索引处的字符。 返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。

闻缺陷则喜何志丹 2002

[leetcode]1202.交换字符串中的元素

给你一个字符串 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" 示例

RegulusF的博客 641

深入解析Flex NOC总线驱动的实时带宽与延迟优化策略

本文深入解析了Flex NOC总线驱动的核心价值与优化策略。通过解读`/proc/noc/real_time`中的实时带宽与延迟数据,并结合`sysfs`接口进行动态QoS调优,可以有效解决芯片内部数据拥堵问题。文章以智能摄像头和算力盒子的实际案例,详细说明了如何通过优先级调整、带宽限制和参数优化,提升系统在复杂任务下的实时性与稳定性。

weixin_29289821的博客 284

【leetcode】交换字符串中的元素(并查集)

给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。 你可以 任意多次交换 在 pairs 中任意一对索引处的字符。 返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。 示例 1: 输入:s = “dcab”, pairs = [[0,3],[1,2]] 输出:“bacd” 解释: 交换...

Skyed_blue的博客 906

高精度磁力计RM3100 传感器LR振荡电路偏置电路分析

LR振荡器电路通过正向和反向偏置实现磁场测量。Sen-XY-f/Z-f传感器线圈作为电感元件构成LR弛张振荡电路,其振荡频率随磁场变化而改变。测量时,线圈一端接地,另一端交替通入正反向电流,通过两次偏置测量消除电路自身磁场干扰,仅保留外部磁场影响。MagI2C芯片通过高速时钟测量振荡次数和时间差,计算磁场强度。该设计具有抗干扰强、数字化输出和高分辨率等优势,是RM3100传感器高精度磁测量的核心原理。

bother3000的博客 1136

VBA常见错误 - “错误3706,未找到提供程序,该程序可能未正确安装”解决方法

1、问题描述 在利用VBA编程时,引用其它表格数据,出现以下问题: (1)运行“错误3706,未找到提供程序,该程序可能未正确安装”。 (2)引用数据失败 2、解决方法 下载“Access 2010 数据库引擎”,并安装即可。 https://www.microsoft.com/en-us/download/details.aspx?id=54920 AccessDatabaseEngine 2010 官方安装包,官网下载不了的可以来这里下载。(1)运行“错误3706,未找到提..

Nemuel的博客 3万+

并查集的妙用——Leetcode 1202

并查集的妙用——Leetcode 1202 给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。 你可以 任意多次交换 在 pairs 中任意一对索引处的字符。 返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。 示例 1: 输入:s = "dcab",...

weixin_43590611的博客 539

锐捷路由器DNS Proxy保姆级配置教程:从零到实战,手把手教你搞定内网域名解析

本文提供锐捷路由器DNS Proxy功能的详细配置教程,从基础环境搭建到实战测试,手把手教你实现内网域名解析。涵盖上游DNS设置、内网域名映射、故障排查等关键步骤,帮助网络管理员快速解决内网访问难题,提升工作效率。

weixin_29284657的博客 555

LeetCode - 1202. 交换字符串中的元素

描述 给你一个字符串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 =...

一只羊 319

23 RAG 为什么答不准:召回、分块、排序的常见坑

RAG 答不准时,不要先怪模型。本文把常见失败拆成召回不到、召回不准、分块不完整、排序靠后、上下文污染和生成不忠实六类,并给出从 Top-K 检查到评估集的排查流程。

老于的笔记的专栏 247

DaVinci配置DID之三:代码实现

本系列主要基于DaVinCi工具链来展开具体DID读写的配置以及最终实现。1,CDD准备2,工具链配置3,代码实现4,验证结果本文讲述流程3话不多说,走你~博主是AutoSar小白,如果哪里表达的有问题,还请大佬们指点指点哈。接下来,让我们在下章关于测试验证的博文再相会哈~

weixin_48498880的博客 5361

QGridLayout交换两个QWidget

交换QGridLayout中的两个QWidget. github传送门:https://github.com/shaoguangwu/SwapGridLayoutWidget 亲测有效。

WSG的博客--盛年不重来,一日难再晨.及时当勉励,岁月不待人. 1194

【华为OD机考真题】- 构成的正方形数量(B卷-100分)(Java版)

🔔本文收录于「最新最全华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新

**My Coding Family** 1349

leetcode 1202 交换字符串中的元素

leetcode 1202 交换字符串中的元素; 并查集构建连续序列;

大草的博客 585

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

1202. 交换字符串中的元素(并查集)(傻瓜教程)(python)(LC)

1202. 交换字符串中的元素 给你一个字符串 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

qq_51174011的博客 349

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

力扣1202.交换字符串中的元素

【代码】力扣1202.交换字符串中的元素。

Pisasama的博客 349

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

并查集详解+Leecode相关题集(二)

这里就不对并查集做具体详解了,只列一下我刷题中遇到的关于并查集的题 如果对并查集还不清楚的,可以先看:并查集详解+Leecode相关题集(一) 这里主要包含了这么几道题 程序员面试金典 - 面试题 17.07. 婴儿名字(并查集) 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来。给定两个列表,一个是名字及对应的频率,另一个是本质相同的名字对。设计一个算法打印出每个真实名字的实际频率

qq_41627847的博客 318

Leetocode 每日一题 并查集 题目整理

547. 省份数量 题目链接: 547 思路: 并查集裸题 代码如下 class Solution { int[] pre; private int find(int x) { if(x==pre[x]) return x; int temp = find(pre[x]); return temp; } private void union(int a,int b) { int pa = find

zamaochick的博客 351

LeetCode第155场周赛(Weekly Contest 155)解题报告 (拓扑排序还没看)

惨不忍睹,隔了好久,终于来做题解了,排名:409 / 1602。其实都不是很难,但在比赛的时候想不出来也是我的菜。后面补题能写完前三题,但是第四题的拓扑排序还真的没见过,又学到新知识了。 第一题,简单排序后就可以了。 第二题,根据题目所给的范围,时间复杂度只能是 O(logn) 才能通过,不然就会超时,所以想到的就是可以利用二分查找在答案范围内找出答案。还使用了容斥原理。 第三题,连通问题,...

Mikchy的博客 455

leetcode刷题之并查集

学习链接:https://zhuanlan.zhihu.com/p/93647900 三个关键点: 1)初始化底层数组,一般是若干个孤立的点。 2)合并连通域 3)查找每个连通域的代表元素。 性能优化: 1)路径压缩 即将当前节点的父节点设置成代表元(递归设置成父节点的父节点)。 2)秩合并 将秩小的的元素的代表元合并到秩大的代表元。 题目: 684. 冗余连接 对无向图类型的树而言,N个节点有N-1条边。如果有N条边,则有一条边加进来的时候会形成环。如果一条边在合并之前属于两个不.

zlgahu的博客 354

并查集专题

【代码】并查集专题。

weixin_75172140的博客 233

并查集

leetcode 1202. 交换字符串中的元素 class DisjointSetUnion { //并查集模板 存储了功能函数与并查集数组 private: vector<int> f, rank; int n; public: DisjointSetUnion(int _n) { n = _n; rank.resize(n, 1); f.resize(n); for (int i = 0; i

weixin_45683677的博客 147

6月26号-并查集题解

6月26号-并查集题解

minit22的博客 122

【每日一题】1月每日刷题总结(并查集)

文章目录605. 种花问题 (贪心)239. 滑动窗口最大值 模板题 单调栈86. 分隔链表399. 除法求值 (模板题 并查集)1202. 交换字符串中的元素 M (并查集,连通元素有序性)1203. 项目管理 H(多层次拓扑排序)803. 打砖块 H (反向并查集)947. 移除最多的同行或同列石头 H (二维并查集合并)其他题目主要是思路 605. 种花问题 (贪心) 虽然是贪心,但是这题目处理贪心的思路是我没有想到的。这个题目首先是找到了一个规律,对于没有种花的一段区域,左端点是lll, 右端点

遍地跑小鸡的博客 544

leetcode 并查集合集

一、(LeetCode 547 省份数量) 题目描述: 有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。 给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。 返回矩

peachzy的博客 564
上一篇: 最近的记录
下一篇: 【算法】Kruskal回顾
皮皮蟹01
博客等级 码龄10年 29粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值