[路飞]_js算法:leetcode 990-等式方程的可满足性

87 阅读1分钟

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;
  }
}