leetcode.990 等式方程的可滿足性

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

 

這題用到並查集

先檢查所有的“==”,把所有“==” 的字母綁到一棵樹上,然後檢查“!=” 的字母,看看他們在不在同一顆樹上

如果在同一顆樹上,那就false

#include <iostream>
#include <vector>
#include <cstring>


using namespace std;

class Solution {
public:
	int p[28] = {0};

    void init(){
        int i;
        for(i = 0; i < 28; i++){
            p[i] = i;
        }
    }


	int find(int x){
		if(p[x] == x){
			return x;
		}
		else{
			p[x] = find(p[x]);
			return p[x];
		}
	}

    bool equationsPossible(vector<string>& equations) {
        init();
    	int len = equations.size();
    	int r1, r2;
        int i;

    	for(i = 0; i < len; i++){
    		if(equations[i][1] == '='){
    			r1 = find(equations[i][0] - 'a');
    			r2 = find(equations[i][3] - 'a');
    			if(r1 != r2){
    				p[r1] = r2;
    			}
    			
    		}
    	}
        for(i = 0; i < len; i++){
            if(equations[i][1] == '!'){
                r1 = find(equations[i][0] - 'a');
                r2 = find(equations[i][3] - 'a');
                if(r1 == r2){
                    return false;
                }
            }
        }
    	return true;
    }
};

int main(){
	string n[] = {"a==b","b!=c","c==a"};
	vector<string> eq(n, n + 3);
	Solution a;
	bool re = a.equationsPossible(eq);
	cout << re << endl;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章