LeetCode 839. 相似字符串组
困难题,没有想到并查集的思想,并且很久不做有点生疏;
以前并查集都是针对于单个目标的次序排列问题,头一次遇到这种归类问题;
基础思想是判断两个字符串是否属于一类,但是这一个问题也蕴含了次序的问题;
例如,a,b,c;
有可能a,b相似,b,c相似,而a,c不相似;
也有可能a,c相似,b,c相似,a,b不相似;
所以就可以采用并查集的思想,直接把这种次序转化为根节点是否是同类,来进行合并,最后数数有几个并查集即可;
遇到问题点:
合并的时候是根节点合并,自己蠢得一笔各种叶节点合并到根节点,导致最后并查集合并错误;
class Solution {
public:
vector<int>father;
void init() {
for (int i = 0; i < father.size(); i++)
father[i] = i;
}
bool isSimilar(const string& a, const string& b) {
int count = 0;
for (int i = 0; i < a.size(); i++) {
if (a[i] != b[i])
count++;
}
if (count > 2)
return false;
else
return true;
}
int findfather(int x) {
if (x == father[x])
return x;
int fa=findfather(father[x]);
father[x] = fa;
return fa;
}
int numSimilarGroups(vector<string>& strs) {
int strs_len = strs.size();
int str_len = strs[0].size();
father.resize(strs_len);
init();
for (int i = 0; i < strs_len; i++) {
for (int j = i + 1; j < strs_len; j++) {
int fa = findfather(i);
int fb = findfather(j);
if (isSimilar(strs[i], strs[j])) {
father[fa]=fb;
}
}
}
int count = 0;
for (int i = 0; i < father.size(); i++) {
if (father[i] == i)
count++;
}
return count;
}
};

浙公网安备 33010602011771号