文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给出长度相同的两个字符串:A 和 B,其中 A[i] 和 B[i] 是一组等价字符。
举个例子,如果 A = "abc" 且 B = "cde",那么就有 'a' == 'c', 'b' == 'd', 'c' == 'e'

等价字符遵循任何等价关系的一般规则:

自反性:'a' == 'a'
对称性:'a' == 'b' 则必定有 'b' == 'a'
传递性:'a' == 'b' 且 'b' == 'c' 就表明 'a' == 'c'
例如,A 和 B 的等价信息和之前的例子一样,那么 S = "eed", "acd" 或 "aab",这三个字符串都是等价的,而 "aab" 是 S 的按字典序最小的等价字符串

利用 A 和 B 的等价信息,找出并返回 S 的按字典序排列最小的等价字符串。

示例 1:
输入:A = "parker", B = "morris", S = "parser"
输出:"makkek"
解释:根据 A 和 B 中的等价信息,
我们可以将这些字符分为 [m,p], [a,o], [k,r,s], [e,i] 共 4 组。
每组中的字符都是等价的,并按字典序排列。所以答案是 "makkek"。示例 2:
输入:A = "hello", B = "world", S = "hold"
输出:"hdld"
解释:根据 A 和 B 中的等价信息,
我们可以将这些字符分为 [h,w], [d,e,o], [l,r] 共 3 组。
所以只有 S 中的第二个字符 'o' 变成 'd',最后答案为 "hdld"。示例 3:
输入:A = "leetcode", B = "programs", S = "sourcecode"
输出:"aauaaaaada"
解释:我们可以把 A 和 B 中的等价字符分为
[a,o,e,r,s,c], [l,p], [g,t] 和 [d,m] 共 4 组,
因此 S 中除了 'u' 和 'd' 之外的所有字母都转化成了 'a',最后答案为 "aauaaaaada"。提示:
字符串 A,B 和 S 仅有从 'a' 到 'z' 的小写英文字母组成。
字符串 A,B 和 S 的长度在 1 到 1000 之间。
字符串 A 和 B 长度相同。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lexicographically-smallest-equivalent-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

请参考:数据结构–并查集(Disjoint-Set)

  • 并查集merge的时候,让祖先字符更小的作为代表
class dsu
{vector<int> f;
public:dsu(int n){f.resize(n);for(int i = 0; i < n; ++i)f[i] = i;}void merge(int a, int b){int fa = find(a), fb = find(b);if(fa > fb)//字母小的当代表,关键点f[fa] = fb;elsef[fb] = fa;}int find(int a){int origin = a;while(a != f[a])a = f[a];return f[origin] = a;}
};
class Solution {public:string smallestEquivalentString(string A, string B, string S) {dsu u(26);for(int i = 0; i < A.size(); ++i)u.merge(A[i]-'a', B[i]-'a');for(int i = 0; i < S.size(); ++i)S[i] = u.find(S[i]-'a')+'a';return S;}
};

0 ms 6.7 MB

  • 一开始没想到字符小的作为代表,是用set做了下处理,代码如下
class dsu
{public:vector<int> f;dsu(int n){f.resize(n);for(int i = 0; i < n; ++i)f[i] = i;}void merge(int a, int b){int fa = find(a), fb = find(b);f[fa] = fb;}int find(int a){int origin = a;while(a != f[a])a = f[a];return f[origin] = a;}
};
class Solution {public:string smallestEquivalentString(string A, string B, string S) {dsu u(26);for(int i = 0; i < A.size(); ++i)u.merge(A[i]-'a', B[i]-'a');unordered_map<int, set<int>> m;for(int i = 0; i < 26; ++i)m[u.find(i)].insert(i);//分组,set内 begin最小,作为代表for(int i = 0; i < 26; ++i)u.f[i] = *m[u.f[i]].begin();//更新祖先为集团内最小的字符for(int i = 0; i < S.size(); ++i)S[i] = u.find(S[i]-'a')+'a';return S;}
};

8 ms 7.4 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 1061. 按字典序排列最小的等效字符串(并查集)相关推荐

  1. LeetCode 1258. 近义词句子(哈希+并查集+排序+回溯)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换 ...

  2. LeetCode 2076. 处理含限制条件的好友请求(并查集)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n ,表示网络上的用户数目.每个用户按从 0 到 n - 1 进行编号. 给你一个下标从 0 开始的二维整数数组 restrictions ...

  3. [leetcode]778水位上升的泳池中游泳,并查集

    本来想用二分的,但看到题面上限制的条件:N*N的二维数组,N小于等于50,而且还限制了二维数组的值是1 ~ N * N-1的排列,看完题解才知道能用并查集做. 题意 在时间为t的时候,水位也会上升到t ...

  4. Leetcode一起攻克搜索(BFS,DFS,回溯,并查集)

    文章目录 BFS简介 DFS简介 回溯简介 并查集简介 DFS题目 690. 员工的重要性 1.dfs解法: 2.bfs算法 547.朋友圈 dfs解法 200.岛屿数量 dfs解法 417.太平洋大 ...

  5. leetcode 778. 水位上升的泳池中游泳(并查集)

    在一个 N x N 的坐标方格 grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度. 现在开始下雨了.当时间为 t 时,此时雨水导致水池中任意位置的水位为 t .你 ...

  6. leetcode:面试题 17.07. 婴儿名字(并查集,代码超时了)

    题目: 分析: 并查集. 我用python写的, 1.创建一个二维列表,然后每个列表中的元素都只有一个,为每个名字. 2.查synonyms,匹配的名字对应的列表合并. 3.排序,求和. 竟然超时了, ...

  7. LeetCode 1697. 检查边长度限制的路径是否存在(排序+并查集)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] = [ui, vi, disi] 表示点 ui 和点 vi 之间有一 ...

  8. 字符串的全排列(字典序排列)

    题目描述 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c 所能排列出来的所有字符串abc, acb, bac, bca, cab, cba. 题目分析 穷 ...

  9. 全排列算法的字典序排列

    字典序排列就是按照字典a-z,1-9的顺序给出字符串的顺序全排列,例如abc的全排列就是从abc一直排到cba.那么给定一个字符串,怎么找出恰好大于该字符串的下一个排列呢? 我们考虑如下的步骤: 1. ...

最新文章

  1. mongodb数据合并设计_MongoDB:如何将来自多个集合的数据合并成一个.?
  2. 移动物联网技术LoRa、SigFox、NB-IoT和eMTC的发展轨迹
  3. Thinkpad系统重装终极版
  4. 最长公共子序列问题LCS
  5. linux 文件io实例代码,linux 文件IO(示例代码)
  6. windows下安装composer抛出Composer\Downloader\TransportException异常解决办法
  7. 使用Github(目的、基本你概念、注册账号)
  8. 光盘 机密_使用保险柜管理机密
  9. LeetCode 1093. 大样本统计
  10. strong vs copy
  11. SpringCloud 微服务入门-Spring Cloud 与微服务概述
  12. 对于C++指针的详细理解
  13. 2021-09-10 转载: 软件开发类项目关键文档
  14. 安卓pdf阅读器_2020年双十一有哪些电纸书、电子书阅读器值得买?Kindle、掌阅、文石、科大讯飞哪个好?...
  15. python清理数据
  16. 注册reg.html是什么,reg命令如何修改注册表?reg命令作用介绍
  17. python 根据名称获取pid_python 使用标准库根据进程名获取进程的pid
  18. 教你N种方法萤石云添加设备(转)
  19. 软件测试(敏捷开发、迭代模型)
  20. 开正式发票到底谁交税

热门文章

  1. 【C#学习笔记】使用C#中的Dispatcher
  2. C语言里if语句变量作为判断条件,C语言教学(九-上)if else判断语句
  3. 5G毫米波通信中一些量化的概念
  4. pipeline代码自动生成
  5. Day 16 包 json模块和os模块
  6. P1547 Out of Hay
  7. sort和qsort函数
  8. Arch Linux下打不开gnome-shell
  9. 实现DIV居中布局三种途径(转)
  10. (译)Windows Azure的7月更新:SQL数据库,流量管理,自动缩放,虚拟机