839.相似字符串组
每个字符串看作一个点,两个字符串之间是否相似看作边,则本题转化为图中有多少连通分量
//并查集模板
class UnionFind{
vector<int>parent;
vector<int>size;
int n;
int setCount;
public:
UnionFind(int _n):n(_n),setCount(_n),parent(_n),size(_n,1){
iota(parent.begin(),parent.end(),0);
}
public:
int findset(int x){
return x==parent[x]?x:parent[x]=findset(parent[x]);
}
bool unite(int x,int y){
x = findset(x);
y = findset(y);
if(x == y)return false;
if(size[x]<size[y])swap(x,y);
parent[y]=x;
size[x]+=size[y];
setCount--;
return true;
}
bool connected(int x,int y){
return x==y;
}
int get_setCount(){
return setCount;
}
bool similar(string &a,string &b,int len){//比较两字符串不同的字符
int cnt = 0;
for(int i=0;i<len;i++){
if(a[i]!=b[i]){
cnt++;
if(cnt>2)return false;
}
}
return true;
}
};
class Solution {
public:
int numSimilarGroups(vector<string>& strs) {
int n = strs.size();
int m = strs[0].size();
UnionFind uf(n);
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(uf.connected(i,j))continue;
if(uf.similar(strs[i],strs[j],m))uf.unite(i,j);//如果两字符串相似,则连通
}
}
return uf.get_setCount();
}
};