题目
给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i]
的长度为 4,并采用两种不同的形式之一:"a==b"
或 "a!=b"
。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。
只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true
,否则返回 false
。
思路
将等式两端的字母建立为并查集,然后检查不等式中是否有并查集中的连通分量。
代码
class Solution {
public boolean equationsPossible(String[] equations) {
int len = equations.length;
int[] parent = new int[26];
for(int i=0; i<26; i++){
parent[i]=i;
}
for(String s:equations){
if(s.charAt(1)=='='){
int index1=s.charAt(0)-'a';
int index2=s.charAt(3)-'a';
union(parent,index1,index2);
}
}
for(String s:equations){
if(s.charAt(1)=='!'){
int index1=s.charAt(0)-'a';
int index2=s.charAt(3)-'a';
if(find(parent,index1)==find(parent,index2)){
return false;
}
}
}
return true;
}
public void union(int[] parent, int index1, int index2){
parent[find(parent,index1)]=find(parent,index2);
}
public int find(int[] parent, int index){
while(parent[index]!=index){
parent[index]=parent[parent[index]];
index=parent[index];
}
return index;
}
}
复杂度分析
- 时间复杂度:O(n+ClogC) //n为等式数量,C为变量的数量。
- 空间复杂度:O(C)