返回介绍

solution / 0900-0999 / 0990.Satisfiability of Equality Equations / README

发布于 2024-06-17 01:03:32 字数 5469 浏览 0 评论 0 收藏 0

990. 等式方程的可满足性

English Version

题目描述

给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 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 以满足满足这两个方程。
    

    示例 3:

    输入:["a==b","b==c","a==c"]
    输出:true
    

    示例 4:

    输入:["a==b","b!=c","c==a"]
    输出:false
    

    示例 5:

    输入:["c==c","b==d","x!=z"]
    输出:true
    

     

    提示:

    1. 1 <= equations.length <= 500
    2. equations[i].length == 4
    3. equations[i][0] 和 equations[i][3] 是小写字母
    4. equations[i][1] 要么是 '=',要么是 '!'
    5. equations[i][2] 是 '='

    解法

    方法一

    class Solution:
      def equationsPossible(self, equations: List[str]) -> bool:
        def find(x):
          if p[x] != x:
            p[x] = find(p[x])
          return p[x]
    
        p = list(range(26))
        for e in equations:
          a, b = ord(e[0]) - ord('a'), ord(e[-1]) - ord('a')
          if e[1] == '=':
            p[find(a)] = find(b)
        for e in equations:
          a, b = ord(e[0]) - ord('a'), ord(e[-1]) - ord('a')
          if e[1] == '!' and find(a) == find(b):
            return False
        return True
    
    class Solution {
      private int[] p;
    
      public boolean equationsPossible(String[] equations) {
        p = new int[26];
        for (int i = 0; i < 26; ++i) {
          p[i] = i;
        }
        for (String e : equations) {
          int a = e.charAt(0) - 'a', b = e.charAt(3) - 'a';
          if (e.charAt(1) == '=') {
            p[find(a)] = find(b);
          }
        }
        for (String e : equations) {
          int a = e.charAt(0) - 'a', b = e.charAt(3) - 'a';
          if (e.charAt(1) == '!' && find(a) == find(b)) {
            return false;
          }
        }
        return true;
      }
    
      private int find(int x) {
        if (p[x] != x) {
          p[x] = find(p[x]);
        }
        return p[x];
      }
    }
    
    class Solution {
    public:
      vector<int> p;
    
      bool equationsPossible(vector<string>& equations) {
        p.resize(26);
        for (int i = 0; i < 26; ++i) p[i] = i;
        for (auto& e : equations) {
          int a = e[0] - 'a', b = e[3] - 'a';
          if (e[1] == '=') p[find(a)] = find(b);
        }
        for (auto& e : equations) {
          int a = e[0] - 'a', b = e[3] - 'a';
          if (e[1] == '!' && find(a) == find(b)) return false;
        }
        return true;
      }
    
      int find(int x) {
        if (p[x] != x) p[x] = find(p[x]);
        return p[x];
      }
    };
    
    func equationsPossible(equations []string) bool {
      p := make([]int, 26)
      for i := 1; i < 26; i++ {
        p[i] = i
      }
      var find func(x int) int
      find = func(x int) int {
        if p[x] != x {
          p[x] = find(p[x])
        }
        return p[x]
      }
      for _, e := range equations {
        a, b := int(e[0]-'a'), int(e[3]-'a')
        if e[1] == '=' {
          p[find(a)] = find(b)
        }
      }
      for _, e := range equations {
        a, b := int(e[0]-'a'), int(e[3]-'a')
        if e[1] == '!' && find(a) == find(b) {
          return false
        }
      }
      return true
    }
    
    class UnionFind {
      private parent: number[];
    
      constructor() {
        this.parent = Array.from({ length: 26 }).map((_, i) => i);
      }
    
      find(index: number) {
        if (this.parent[index] === index) {
          return index;
        }
        this.parent[index] = this.find(this.parent[index]);
        return this.parent[index];
      }
    
      union(index1: number, index2: number) {
        this.parent[this.find(index1)] = this.find(index2);
      }
    }
    
    function equationsPossible(equations: string[]): boolean {
      const uf = new UnionFind();
      for (const [a, s, _, b] of equations) {
        if (s === '=') {
          const index1 = a.charCodeAt(0) - 'a'.charCodeAt(0);
          const index2 = b.charCodeAt(0) - 'a'.charCodeAt(0);
          uf.union(index1, index2);
        }
      }
      for (const [a, s, _, b] of equations) {
        if (s === '!') {
          const index1 = a.charCodeAt(0) - 'a'.charCodeAt(0);
          const index2 = b.charCodeAt(0) - 'a'.charCodeAt(0);
          if (uf.find(index1) === uf.find(index2)) {
            return false;
          }
        }
      }
      return true;
    }
    

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
    列表为空,暂无数据
      我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
      原文