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;
}
};