力扣839.相似字符串组
并查集
并查集是一种树形结构,又叫“不相交集合”,保持了一组不相交的动态
集合,每个集合通过一个代表来识别,代表即集合中的某个成员,通常
选择根做这个代表。
通常包括创建新的集合,寻找根节点,合并节点。
思路
两个字符串相比较,不同则加1,超过两处不同,则无法连接到一个节
点,从而判断是否相似。
用下标代替字符,通过并查集来连接相似的字符串,从而判断出有多少
相似字符串组。
力扣官方代码
int find(int *f, int x) {
return f[x] == x ? x : (f[x] = find(f, f[x]));
}
bool check(char *a, char *b, int len) {
int num = 0;
for (int i = 0; i < len; i++) {
if (a[i] != b[i]) {
num++;
if (num > 2) {
return false;
}
}
}
return true;
}
int numSimilarGroups(char **strs, int strsSize) {
int n = strsSize;
int m = strlen(strs[0]);
int f[n];
for (int i = 0; i < n; i++) {
f[i] = i;
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
int fi = find(f, i), fj = find(f, j);
if (fi == fj) {
continue;
}
if (check(strs[i], strs[j], m)) {
f[fi] = fj;
}
}
}
int ret = 0;
for (int i = 0; i < n; i++) {
if (f[i] == i) {
ret++;
}
}
return ret;
}