class USF
{
public:int *parent;int *rank;int groupCount;     //组数USF(int n){parent = new int[n];rank = new int[n];groupCount = n;for(int i = 0; i < n; i++){parent[i] = i;rank[i] = 0;}}~USF(){delete [] parent;delete [] rank;}int find(int x){if(x != parent[x]){parent[x] = find(parent[x]);}return parent[x];}void merge(int x, int y){int xroot = find(x);int yroot = find(y);if(xroot == yroot){return ;}if(rank[xroot] < rank[yroot]){parent[xroot] = yroot;}else if(rank[xroot] > rank[yroot]){parent[yroot] = xroot;}else{parent[yroot] = xroot;rank[xroot]++;}groupCount--;       //组数减一}
};class Solution {public:int numSimilarGroups(vector<string>& A) {int n = A.size();USF usf(n);for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if( isSimilar(A[i], A[j]) ){usf.merge(i, j);}}}return usf.groupCount;}bool isSimilar(string a, string b){int difference = 0;for(int i = 0; i < a.size(); i++){if(a[i] != b[i]){difference++;if(difference > 2){return false;}}}return true;}
};

参照官方的题解,改成C++的,但是很慢

class USF
{
public:int *parent;int *rank;int groupCount;     //组数USF(int n){parent = new int[n];rank = new int[n];groupCount = n;for(int i = 0; i < n; i++){parent[i] = i;rank[i] = 0;}}~USF(){delete [] parent;delete [] rank;}int find(int x){if(x != parent[x]){parent[x] = find(parent[x]);}return parent[x];}void merge(int x, int y){int xroot = find(x);int yroot = find(y);if(xroot == yroot){return ;}if(rank[xroot] < rank[yroot]){parent[xroot] = yroot;}else if(rank[xroot] > rank[yroot]){parent[yroot] = xroot;}else{parent[yroot] = xroot;rank[xroot]++;}groupCount--;       //组数减一}
};class Solution {public:int numSimilarGroups(vector<string>& A) {int n = A.size();if(n < 1) return 0;int w = A[0].size();USF usf(n);if(n < w*w){for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if( isSimilar(A[i], A[j]) ){usf.merge(i, j);}}}}else{map<string, set<int>>buckets;for(int i = 0; i < n; i++){string str = A[i];for(int j = 0; j < w; j++){for(int k = j + 1; k < w; k++){swap(str[j], str[k]);buckets[str].insert(i);swap(str[j], str[k]); }}}for(int i = 0; i < n; i++){if(buckets.count(A[i]) == 1){for(auto x : buckets[A[i]]){usf.merge(x, i);}}}}return usf.groupCount;}bool isSimilar(string a, string b){int difference = 0;for(int i = 0; i < a.size(); i++){if(a[i] != b[i]){difference++;if(difference > 2){return false;}}}return true;}
};

[leetcode] 839. 相似字符串组并查集相关推荐

  1. leetcode 839. 相似字符串组(并查集)

    如果交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等,那么称 X 和 Y 两个字符串相似.如果这两个字符串本身是相等的,那它们也是相似的. 例如,"tars" 和 ...

  2. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  3. 839. 相似字符串组

    链接:839. 相似字符串组 题解: class Solution {public:vector<int> _rank;vector<int> _id;int find(int ...

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

    文章目录 1. 题目 2. 解题 1. 题目 给出长度相同的两个字符串:A 和 B,其中 A[i] 和 B[i] 是一组等价字符. 举个例子,如果 A = "abc" 且 B = ...

  5. LeetCode 684. 冗余连接(并查集)

    1. 题目 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, -, N) 的树及一条附加的边构成.附加的边的两个顶点包含在1到N中间,这条附 ...

  6. LeetCode 803. 打砖块(并查集)

    文章目录 1. 题目 2. 解题 1. 题目 有一个 m x n 的二元网格,其中 1 表示砖块,0 表示空白. 砖块 稳定(不会掉落)的前提是: 一块砖直接连接到网格的顶部,或者 至少有一块相邻(4 ...

  7. leetcode 765. 情侣牵手(并查集)

    N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 到 2N-1 的整 ...

  8. [Leetcode 每日精选](本周主题-并查集) 面试题 17.07. 婴儿名字

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题多了一些变化, 但核心仍然是并查集. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到该系列当前已 ...

  9. leetcode 721. 账户合并(并查集)

    给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该账户的邮箱地址 ...

最新文章

  1. 闪退怎么看logcat_iPhone手机点开软件就闪退如何解决?
  2. 费氏搜寻法之算法分析与实现
  3. 现代前端开发路线图:从零开始,一步步成为前端工程师
  4. 【Python】多线程
  5. RTX5 | 时间延时
  6. CentOs基础操作指令(文件目录类)
  7. 将a数组部分给b数组c语言,C语言第6章1 数组.ppt
  8. [转]Linux内核基础与常用命令总结
  9. 升压和升降压拓扑中IDC与IO的关系推导 // 《精通开关电源设计》P41式2-2
  10. 比较流行的日志分析软件
  11. hdu--4487--dp
  12. Activity设置竖屏显示
  13. 将人工智能(AI)应用于软件测试中
  14. 2021-04-20论文——视网膜识别技术作为绵羊生物识别方法的评价
  15. 1、u3d 下载、安装
  16. 什么是TAO以及如何安装和使用TAO
  17. 腾讯区块链正式落地法律场景,携手慧狮构建“司法联盟链”
  18. 易语言64位端游内存封包逆向教程介绍---传奇4实战(易全网首套)
  19. 漫画:生命游戏(头条、Google 面试题)
  20. Carsim 与 Simulink 联合仿真用到的ABS.mdl模型文件

热门文章

  1. 自学python到什么程度就可以工作-自学Python爬虫学到什么程度?就可以去找工作了?...
  2. python编程入门 pdf-Python编程从入门到精通.pdf
  3. python就业方向-连小学生都在学的Python,究竟就业方向有哪些?
  4. 学python有前途吗-三十岁了,从零开始学python还有前途吗?
  5. python导入模块中的对象_详解Python项目开发时自定义模块中对象的导入和使用
  6. 本地apk安装是什么意思_Sony电视安装第三方播放器
  7. linux 扫描开放的端口命令,在Linux系统中检查(扫描)开放端口的方法
  8. mock server java_MockServer 简单示例
  9. JavaScript 中 call()、apply()、bind() 的用法
  10. 开发中git的常用命令