Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 등식의 만족

<시간/>

변수 사이의 관계를 나타내는 방정식이 배열인 경우 이제 각 문자열 방정식[i]은 길이가 4이고 "a==b" 또는 "a!=b"의 두 가지 다른 형식 중 하나를 취합니다. 여기서 및 b는 소문자로, 한 글자로 된 변수 이름을 나타냅니다. 따라서 주어진 모든 방정식을 만족시키기 위해 변수 이름에 정수를 할당할 수 있는 경우에만 참을 찾아야 합니다.

입력이 ["a==b","b==c","a==c"]와 같으면 대답은 true가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • getParent()라는 메서드를 정의합니다. 이것은 문자 x와 맵 m을 사용하며 다음과 같이 작동합니다. -

  • m[x] =x이면 x를 반환합니다.

  • 그렇지 않으면 m[x] :=getParent(m[x], m)를 설정하고 m[x]

    를 반환합니다.
  • 기본 방법에서 다음을 수행하십시오 -

  • 두 개의 배열을 equal 및 notEqual 정의하고 parent라는 맵을 만듭니다.

  • n :=e의 크기

  • 0 ~ n – 1 범위의 i에 대해

    • 부모 설정[e[i, 0]] :=e[i, 0], 부모[e[i, 3]] :=e[i, 3]

    • e[i, 1]이 등호이면 i를 등호 배열에 삽입하고, 그렇지 않으면 i를 notEqual 배열에 삽입

  • 범위 0에서 동일한 크기의 i에 대해 - 1

    • index :=equal[i], u, v를 e[index, 0] 및 e[index, 3]

      로 설정
    • 부모[getParent(u, 부모)] :=부모[getParent(v, 부모)]

  • 범위 0에서 notEqual – 1까지의 i에 대해

    • index :=notEqual[i], u, v를 e[index, 0] 및 e[index, 3]

      로 설정
    • getParent(u, parent) =getParent(v, parent)인 경우 false를 반환합니다.

  • true를 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#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