LeetCode 839. 相似字符串组
困难题,没有想到并查集的思想,并且很久不做有点生疏;
以前并查集都是针对于单个目标的次序排列问题,头一次遇到这种归类问题;
基础思想是判断两个字符串是否属于一类,但是这一个问题也蕴含了次序的问题;
例如,a,b,c;
有可能a,b相似,b,c相似,而a,c不相似;
也有可能a,c相似,b,c相似,a,b不相似;
所以就可以采用并查集的思想,直接把这种次序转化为根节点是否是同类,来进行合并,最后数数有几个并查集即可;
遇到问题点:
合并的时候是根节点合并,自己蠢得一笔各种叶节点合并到根节点,导致最后并查集合并错误;
class Solution { public: vector<int>father; void init() { for (int i = 0; i < father.size(); i++) father[i] = i; } bool isSimilar(const string& a, const string& b) { int count = 0; for (int i = 0; i < a.size(); i++) { if (a[i] != b[i]) count++; } if (count > 2) return false; else return true; } int findfather(int x) { if (x == father[x]) return x; int fa=findfather(father[x]); father[x] = fa; return fa; } int numSimilarGroups(vector<string>& strs) { int strs_len = strs.size(); int str_len = strs[0].size(); father.resize(strs_len); init(); for (int i = 0; i < strs_len; i++) { for (int j = i + 1; j < strs_len; j++) { int fa = findfather(i); int fb = findfather(j); if (isSimilar(strs[i], strs[j])) { father[fa]=fb; } } } int count = 0; for (int i = 0; i < father.size(); i++) { if (father[i] == i) count++; } return count; } };