Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >并查集经典题解——交换字符串中的元素

并查集经典题解——交换字符串中的元素

作者头像
用户6557940
发布于 2022-07-24 08:39:24
发布于 2022-07-24 08:39:24
51700
代码可运行
举报
文章被收录于专栏:Jungle笔记Jungle笔记
运行总次数:0
代码可运行

如果刷朋友圈的时候你还不知道并查集,那么可以看看这篇:

每天都刷朋友圈,那你知道并查集吗?

在LeetCode上标签为“并查集”的题目不少,大部分题目在使用并查集后,解法一目了然,十分清晰,比如这篇文章要分析的一个题目——交换字符串中的元素

看了题目给出的3个示例,更有助于我们理解题意:

示例 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"

比如我们分析示例2, s="dcab",pairs = [[0,3],[1,2],[0,2]]。其中:

  • pairs[0]=[0,3]——s中第0和第3个位置的字符可以交换位置(任意多次)。即“dcab”可以变成“bcad”,因为b比d小(排在字典序前面)。
  • pairs[1]=[1,2]——s中第1和第2个位置的字符可以交换位置(任意多次)。即“dcab”可以变成“dacb”。结合着pairs[0],即可变为"bacd",因为a比c小。
  • pairs[2]=[0,2]——s中第0和第2个位置的字符可以交换位置(任意多次)。注意结合pairs[0],第0个字符和第3个字符可以互换位置,那么现在第0、2、3个字符都可以互换位置。再结合pairs[1],第0、1、2、3都可以互换位置了。那根据题目要求,顺序排为“abcd”即可

根据上面的分析,这道题可以分成两个步骤:

  1. 联合:查看pairs里哪些组合可以形成一个集合,比如[0,3]和[2,3]可以构成一个集合[0,2,3];
  2. 排序:将集合中可交换的位置对应的字符按照字典序排序。比如[0,2,3]三个位置对应的字符d,a,b排序后卫a, b, d。

这个步骤中的联合,可以用并查集来实现。并查集怎么写呢?同样,可以先看这篇文章:每天都刷朋友圈,那你知道并查集吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UnionFind{
private:
  int n;
  int *parent;
  int *rank;
public:
  UnionFind(int n){
    this->n = n;
    this->parent = new int[n];
    this->rank = new int[n];
    for (int i = 0; i < n; i++){
      parent[i] = i;
      rank[i] = 1;
    }
  }
  ~UnionFind(){
    delete[]rank;
    delete[]parent;
  }
  int find(int p){
    while (p != parent[p]){
      parent[p] = parent[parent[p]];
      p = parent[p];
    }
    return p;
  }
  bool isConnected(int p, int q){
    return find(p) == find(q);
  }
  void unionElements(int p, int q){
    int rootP = find(p);
    int rootQ = find(q);
    if (rootP == rootQ) return;
    if (rank[rootP] < rank[rootQ]){
      parent[rootP] = rootQ;
    }
    else if (rank[rootQ] < rank[rootP]){
      parent[rootQ] = rootP;
    }
    else{
      parent[rootQ] = rootP;
      rank[rootP] += 1;
    }
  }
};

根据上述思路,本题题解如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
  int size = s.length();
  UnionFind uf(size);

  // 1. 将可以互相交换位置的索引联合
  for (int i = 0; i < pairs.size(); i++){
    uf.unionElements(pairs[i][0], pairs[i][1]);
  }

  string res;

  // 2. 将每个集合的索引对应位置的字符,存入一个数组
  vector<vector<char>>v(size);
  for (int i = 0; i < size; i++){
    // 因为每个集合里的索引都指向同一个parent,所以用uf.find(i)来表示买个集合的索引
    v[uf.find(i)].push_back(s[i]);
  }

  // 3. 排序:将每个集合里的字符按照字典序排序
  for (int i = 0; i < v.size(); i++){
    sort(v[i].rbegin(), v[i].rend());
  }
  // 4. 构造返回值
  for (int i = 0; i < size; i++){
    res += v[uf.find(i)].back();
    v[uf.find(i)].pop_back();
  }

  return res;
}

关于并查集,你还可以看:

  • 130.被包围的区域
  • 200.岛屿数量
  • 684.多余连接
  • ……
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Jungle笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 1202. 交换字符串中的元素(并查集)
给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。
Michael阿明
2020/07/13
7530
Leetcode No.1202 交换字符串中的元素
给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。
week
2022/01/07
6690
搞定大厂算法面试之leetcode精讲23.并查集
Find:确定元素属于哪一个子集,他可以被用来确定两个元素是否属于同一个子集,加入路径压缩,复杂度近乎O(1)
全栈潇晨
2021/12/07
5250
文心一言 VS 讯飞星火 VS chatgpt (345)-- 算法导论23.2 4题
四、假定图中的边权重全部为整数,且在范围$1 \sim |V|$内。在此种情况下,Kruskal算法最快能多快?如果边的权重取值范围在1到某个常数$W$之间呢?如果要写代码,请用go语言。
福大大架构师每日一题
2024/09/13
1210
文心一言 VS 讯飞星火 VS chatgpt (345)-- 算法导论23.2 4题
用javascript分类刷leetcode并查集(图文视频讲解)
Find:确定元素属于哪一个子集,他可以被用来确定两个元素是否属于同一个子集,加入路径压缩,复杂度近乎O(1)
js2030code
2022/12/16
5970
【python刷题】并查集
这里借用百度百科的一句话:并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。假设现在有一个武林大会,包含了少林、峨嵋、武当等门派,通过并查集就可以将每个人归类到自己的门派中。
西西嘛呦
2021/01/29
7700
并查集(Union Find)
  我们之前讲的树结构,都是由父亲节点指向孩子节点,而并查集却是由孩子指向父亲的这样一种数据结构。
程序员波特
2024/01/19
1960
并查集(Union Find)
130. 被围绕的区域
并查集定义 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(union-find algorithm)定义了两个用于此数据结构的操作:
张伦聪zhangluncong
2022/10/26
3820
每天都刷朋友圈,那你知道并查集吗?
微信大概是我们每天必须接触的一个APP之一,公交上、地铁上、工作休息时,刷刷朋友圈,看看好友当天经历了什么。相较于QQ,微信的一个特点之一就是:除非好友的好友也是你的好友,否则你在朋友圈里看不到好友的好友对好友朋友圈的点赞和评论。
用户6557940
2022/07/24
6160
每天都刷朋友圈,那你知道并查集吗?
LeetCode 684.冗余连接 - JavaScript
输入一个图,该图由一个有着 N 个节点 (节点值不重复 1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在 1 到 N 中间,这条附加的边不属于树中已存在的边。
心谭博客
2020/04/21
6350
「慕K体系」计算机基础课-算法
数据结构与算法是计算机科学的基础。包括堆、优先队列、各种排序算法(堆排序、冒泡排序、希尔排序)、线段树、Trie树、并查集、AVL树及红黑树。
用户11190134
2024/08/20
1230
文心一言 VS 讯飞星火 VS chatgpt (280)-- 算法导论20.4 1题
一、假设 CONNECTED-COMPONENTS 作用于一个无向图 G=(V,E),这里V={a,b,c,d,e,f,g,h,i,j,k},且 E 中的边以如下的顺序处理:(d,i),(f,k),(g,i),(b,g),(a,h),(i,j),(d,k),(b,j),(d,f),(g,j),(a,e)。请列出在每次执行完第3~5行后各连通分量的顶点。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
890
文心一言 VS 讯飞星火 VS chatgpt (280)-- 算法导论20.4 1题
数据结构之并查集
并查集(Union Find),从字面意思不太好理解这东西是个啥,但从名字大概可以得知与查询和集合有关,而实际也确实如此。并查集实际上是一种很不一样的树形结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。
端碗吹水
2021/02/02
1.1K0
LeetCode 721.账户合并 - JavaScript
给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是名称 (name),其余元素是 emails 表示该帐户的邮箱地址。
心谭博客
2020/04/21
7500
2023-05-23:如果交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等, 那么称 X 和 Y 两个字符串相似。如果这两个字符串本身是相等的,
2023-05-23:如果交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等,
福大大架构师每日一题
2023/05/23
8530
东哥带你刷图论第五期:Kruskal 最小生成树算法
图论中知名度比较高的算法应该就是 Dijkstra 最短路径算法,环检测和拓扑排序,二分图判定算法 以及今天要讲的最小生成树(Minimum Spanning Tree)算法了。
labuladong
2021/11/09
2.2K0
文心一言 VS 讯飞星火 VS chatgpt (292)-- 算法导论21.3 5题
五、证明:任何具有 m 个 MAKE-SET、UNION 和 FIND-SET 操作的序列,这里所有的 LINK 操作都出现在 FIND-SET 操作之前,如果同时使用路径压缩和按秩合并启发式策略,则这些操作只需 O(m) 的时间。在同样情况下,如果只使用路径压缩启发式策略,又会如何?如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
850
文心一言 VS 讯飞星火 VS chatgpt (292)-- 算法导论21.3 5题
200. 岛屿的个数
给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
张伦聪zhangluncong
2022/10/26
1910
LeetCode547题 朋友圈(并查集)
班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。
SakuraTears
2022/01/13
7440
分享几道适合用来面试的 LeetCode 算法题
Hi,大家好,这几天公司忙着年会,整个大部门去西安出差了几天,今天刚刚回来,所以我这几天没有怎么搭理公号。
崔庆才
2019/09/27
1.7K0
分享几道适合用来面试的 LeetCode 算法题
相关推荐
LeetCode 1202. 交换字符串中的元素(并查集)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验