题目:
题解:
判断字符串是否相似:字符串本身一样,或, 只有两个位置的字符换了位置
由于给出的所有字符串长度都一样,且涉及到的字符都一样,所以要判断是否为相似字符串,
首先看他们是否equals,否则查看他们每个位置对应的字符是否一致,统计不一样的次数,如果超过2,则不相似,否则相似。
然后用并查集将相似的连通,最终统计连通块就行
代码:
class Solution {
public int numSimilarGroups(String[] strs)
{
int n = strs.length;
int len = strs[0].length();
UnionFind uf = new UnionFind(n);
for(int i = 0 ; i < n; i++)
{
char[] ci = strs[i].toCharArray();
for(int j = i+1; j < n;j++)
{
char[] cj = strs[j].toCharArray();
if(strs[i].equals(strs[j]))
{
uf.union(i,j);
}
else if(isanagram(ci,cj,len))
{
uf.union(i,j);
}
}
}
int ans = 0;
for(int i = 0; i < n; i++)
{
if(uf.find(i)==i)
{ans+=1;}
}
return ans;
}
public boolean isanagram(char[] ci, char[] cj , int len)
{
int num=0;
for(int i = 0; i < len ; i++)
{
if(ci[i]!=cj[i])
{
num+=1;
if(num>2)
{
return false;
}
}
}
return true;
}
public class UnionFind
{
int[] f;
public UnionFind(int n)
{
f = new int[n];
for(int i = 0;i<n;i++)
{f[i]=i;}
}
public int find(int x)
{
if(f[x]!=x)
{
f[x] = find(f[x]);
}
return f[x];
}
public void union(int x, int y)
{
int fx = find(x);
int fy = find(y);
if(fx!=fy)
{
f[fx]=fy;
}
}
}
}