C ++中的等式的可满足性

假设我们有一个数组,如果方程表示变量之间的关系,那么现在每个字符串方程[i]的长度为4,并采用两种不同形式之一:“ a == b”或“ a!= b”。在此,a和b是小写字母,代表一个字母的变量名。因此,当且仅当可以为变量名称分配整数以满足所有给定的方程式时,我们才必须找到true。

如果输入像:[“ a == b”,“ b == c”,“ a == c”],那么答案将是正确的。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个名为的方法getParent(),它将使用字符x和映射m,这将如下工作:

  • 如果m [x] = x,则返回x,

  • 否则设置m [x]:= getParent(m [x],m)并返回m [x]

  • 从主要方法中,执行以下操作-

  • 定义两个数组equal和notEqual,创建一个称为parent的映射

  • n:= e的大小

  • 对于i,范围为0至n – 1

    • 设置parent [e [i,0]]:= e [i,0],parent [e [i,3]]:= e [i,3]

    • 如果e [i,1]是等号,则将i插入等号数组,否则将i插入notEqual数组

  • 对于范围在0到相等– 1的i

    • index:= equal [i],将u,v设置为e [index,0]和e [index,3]

    • 父母[getParent(u,parent)]:=父母[getParent(v,父母)]

  • 对于范围从0到不等于1的i

    • index:= notEqual [i],将u,v设置为e [index,0]和e [index,3]

    • 如果getParent(u,parent)= getParent(v,parent),则返回false

  • 返回真

让我们看下面的实现以更好地理解-

示例

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   char getParent(char x, map <char, char> m){
      if(m[x] == x) return x;
      return m[x] = getParent(m[x], m);
   }
   bool equationsPossible(vector<string>& e) {
      vector <int> equal;
      vector <int> notEqual;
      map <char, char> parent;
      int n = e.size();
      for(int i = 0; i < n; i++){
         parent[e[i][0]]= e[i][0];
         parent[e[i][3]]= e[i][3];
         if(e[i][1] == '='){
            equal.push_back(i);
         }else{
            notEqual.push_back(i);
         }  
      }
      for(int i = 0; i < equal.size(); i++){
         int idx = equal[i];
         char u = e[idx][0];
         char v = e[idx][3];
         parent[getParent(u, parent)] = parent[getParent(v, parent)];
      }
      for(int i = 0; i < notEqual.size(); i++){
         int idx = notEqual[i];
         char u = e[idx][0];
         char v = e[idx][3];
         if(getParent(u, parent) == getParent(v, parent)) return false;
      }
      return true;
   }
};
main(){
   vector<string> v1 = {"a==b","b==c","a==c"};
   Solution ob;
   cout << (ob.equationsPossible(v1));
}

输入值

["a==b","b==c","a==c"]

输出结果

true