题目描述
题目链接:https://leetcode-cn.com/problems/similar-string-groups/
解题思路
提示不靠谱,String数组长度有超过100的测试点!!!
今日随机题,又双叒叕并查集,连续三天并查集题目~
一个String当作一个节点,两个String只交换一次字符就相等说明联通,考虑每个String与其他所有String是否联通,检查是否连通,暴力比较字符不同的位置超过2个说明不连通。
并查集使用路径压缩,方便最后直接统计最大连通分量,即直接看p[i]==i的
Java实现
class Solution {
private static int p[] = null;
public int numSimilarGroups(String[] strs) {
int n = strs.length;
p = new int[n];
for(int i = 0;i < n;i++) p[i] = i;
for(int i = 0;i < n;i++){
for(int j = i;j < n;j++){
if(Check(strs[i],strs[j])) Union(i,j);
}
}
int ans = 0;
for(int i = 0;i < n;i++){
if(p[i]==i) ans++;
}
return ans;
}
static boolean Check(String x,String y){
int l = x.length();
int cnt = 0;
for(int i = 0;i < l;i++){
if(x.charAt(i)!=y.charAt(i)){
cnt++;
if(cnt > 2)
return false;
}
}
return true;
}
static void Union(int x,int y){
int px = Find(x);
int py = Find(y);
if(px!=py){
p[px] = py;
}
}
static int Find(int x){
return x==p[x]?x:(p[x]=Find(p[x]));
}
}