题目描述:
给定一个由表示变量之间关系的字符串方程组成的数组;每个字符串方程equations[i]的长度为4,并采用两种不同形式之一:"a==b"或"a!=b"。在这里,a和b是小写字母(不一定不同),表示单字母变量名。只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回true,否则返回false.
示例1:
输入:["a==b","b!=a"]
输出:fasle
解释:如果我们指定,a=1且b=1,那么可以满足第一个方程,但无法满足第二个方程。没有办法分配变量同时满足这两个方程
示例2:
输入:["b==a","a==b"]
输出:true
解释:我们可以指定a=1且b=1以满足这两个方程
示例3:
输入:["a==b","b==c","a==c"]
输出:true
解答:
根据方程给定的关系,可以把存在相等关系的字母划分到一个集合,不相等的字母分别属于两个不同的集合;于是可以用并查集解决本题。
int fa[26] = {0};
int findFa(int x)
{
int a = x;
while(fa[x] != x) x = fa[x];
while(a != x)
{
int z = fa[a];
fa[a] = x;
a = z;
}
return x;
}
bool equationsPossible(vector<string>& equations) {
for(int i=0;i<26;i++) fa[i] = i;
int len = equations.size();
for(int i=0;i<len;i++)
{
if(equations[i][1] == '=')
{
int fl = findFa(equations[i][0] - 'a');
int fr = findFa(equations[i][3] - 'a');
if(fl != fr) fa[fl] = fa[fr];
}
}
for(int i=0;i<len;i++)
{
if(equations[i][1] == '!'){
int fl = findFa(equations[i][0] - 'a');
int fr = findFa(equations[i][3] - 'a');
if(fl == fr) return false;
}
}
return true;
}