zoukankan      html  css  js  c++  java
  • 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 以满足满足这两个方程。
    

    示例 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] 是 '='

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/satisfiability-of-equality-equations
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    处理所有的相等关系后(相等关系的传递性),判断不等关系是否有矛盾。

    莽一点做法 , BFS

    class Solution {
     public:
      bool BFS(int s, int t, vector<int>(& g)[27])const {
        queue<int>que;
        vector<bool>vis(27, false);
        que.push(s);
        vis[s] = true;
        while(!que.empty()) {
          int u = que.front();
          if(u == t)
            return true;
          que.pop();
          for(auto v : g[u]) {
            if(!vis[v])
              que.push(v), vis[v] = true;
          }
        }
        return false;
      }
    
      bool equationsPossible(vector<string>& equations) {
        vector<int>g[27];
        for(auto i : equations) {
          if(i[1] == '=') {
            int u = i[0] - 'a';
            int v = i[3] - 'a';
            g[u].push_back(v);
            g[v].push_back(u);
          }
        }
        for(auto i : equations) {
          if(i[1] == '!') {
            int u = i[0] - 'a';
            int v = i[3] - 'a';
            if(BFS(u, v, g))
              return false;
          }
        }
        return true;
      }
    };
    

    trick 点的方法,并查集

    class Solution {
     public:
      const int n = 26;
      vector<int>fa;
    
      int get_fa(int u) {
        return fa[u] = (fa[u] == u ? u : get_fa(fa[u]));
      }
      bool equationsPossible(vector<string>& equations) {
        fa = vector<int>(26);
        for(int i = 0; i < n; ++i)
          fa[i] = i;
        for(auto i : equations) {
          int u = i[0] - 'a';
          int v = i[3] - 'a';
          if(i[1] == '=') {
            fa[get_fa(u)] = get_fa(v);
          }
        }
        for(auto i : equations) {
          int u = i[0] - 'a';
          int v = i[3] - 'a';
          if(i[1] != '=') {
            if(get_fa(u) == get_fa(v))
              return false;
          }
        }
        return true;
      }
    };
    
  • 相关阅读:
    Configure JSON.NET to ignore DataContract/DataMember attributes
    Visual Studio 独立 Shell 下载
    Xamarin.Forms 自定义 TapGestureRecognizer 附加属性
    Xamarin 自定义 ToolbarItem 溢出菜单实现(Popover/Popup) 弹出下拉效果
    xamarin.forms 动态条件更换数据模板
    Xamarin.Forms FlexLayout 布局扩展+ 模板扩展+弹性换行
    Xamarin.Forms 开发资源集合
    Xamarin Forms Api请求开源框架Refit
    Xamarin Forms error MSB6006: “java.exe”已退出,代码为 2 解决办法
    Xamarin.Forms 未能找到路径“x:platforms”的一部分
  • 原文地址:https://www.cnblogs.com/Forgenvueory/p/13063813.html
Copyright © 2011-2022 走看看