leetcode 990. 等式方程的可满足性
问题描述: 给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:"a==b" 或 "a!=b"。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。
只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。
示例 1:
输入: ["a==b","b!=a"]
输出: false
解释: 如果我们指定,a = 1 且 b = 1,那么可以满足第一个方程,但无法满足第二个方程。没有办法分配变量同时满足这两个方程。
示例 2:
输入: ["b==a","a==b"]
输出: true
解释: 我们可以指定 a = 1 且 b = 1 以满足满足这两个方程。
思路: 并查集(注意字母字符串处理)
/**
* @param {string[]} equations
* @return {boolean}
*/
var equationsPossible = function(equations) {
let union=new unionSize(26);
for(let i=0;i<equations.length; i++){
if(equations[i][1]=='='){
let a=equations[i][0].charCodeAt()-'a'.charCodeAt()
let b=equations[i][3].charCodeAt()-'a'.charCodeAt()
union.merge(a,b)
}
}
for(let i=0;i<equations.length; i++){
if(equations[i][1]=='!'){
let a=equations[i][0].charCodeAt()-'a'.charCodeAt();
let b=equations[i][3].charCodeAt()-'a'.charCodeAt();
if(union.find(a)==union.find(b))return false;
}
}
return true;
};
class unionSize{
constructor(n){
this.node=new Array(n).fill(0).map((item,index)=>index);
}
find(x){
return this.node[x]=(x===this.node[x]?x:this.find(this.node[x]))
}
merge(x,y){
let fa=this.find(x),fb=this.find(y);
this.node[fa]=fb;
}
}