题解
题意为:找到能交换两个字符或者相同的就在一组,如果一堆中只有一个符合这样的条件就在这个堆中,即AB满足条件 BC满足条件那么ABC就在一堆中。
并查集,先查找 再合并到一个堆中。
这里学习到一个点就是标记的时候都可以用数字标记,只要符合条件即可,用什么标记都行。
还有题目中给出的是字母异位词,即只是字母顺序不同,其余相同,即这里只需要判断字母不相同的个数即可。
还需要注意字符相同的情况下也符合条件。
代码
class Solution {
public:
int pre[1005];
void init(int n,vector<string>& strs){
for(int i = 0; i < n;i++){
pre[i] = i;
}
}
int find(int x){
while( x != pre[x]){
x = pre[x];
}
return x;
}
void join(int a ,int b){
int temp_a = find(a);
int temp_b = find(b);
if(temp_a != temp_b){
pre[temp_a] = temp_b;
}
}
bool issimilar(string a,string b){
int wa = 0;
for(int i = 0; i < a.size(); i++){
if(a[i] != b[i])
wa++;
}
if(wa == 2 || wa == 0)
return true;
return false;
}
int numSimilarGroups(vector<string>& strs) {
int n = strs.size();
init(n,strs);
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
if(issimilar(strs[i],strs[j])){
join(i,j);
}
}
}
int sum = 0;
for(int i = 0; i < n; i++){
if(pre[i] == i){
sum++;
}
}
return sum;
}
};