每日一题,防止痴呆 = =
一、题目大意
给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。
只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/satisfiability-of-equality-equations
二、题目思路以及AC代码
思路:并查集
这道题的抽象意思就是,有若干等式,这些等式不能出现矛盾的地方,比如根据一些等式推出 a == c,然后有一个等式是 a != c,那就返回false,否则就返回true。那么我们的问题就在于如何由多个等式结合推出几个数相等的关系,也很容易的想到并查集。
就是当两数相等的时候,就将这两个数放到一个集合中,则遍历完数组的时候,所有相等的元素就在一个集合中,而此时再去遍历那些不等式,如果发现此时不等式两侧的元素在一个集合中存在,那么返回false,否则返回true。
AC代码
class Solution {
private:
int* p;
public:
int findRoot(int x) {
if (x == p[x]) return x;
return p[x] = findRoot(p[x]);
}
void combine(int x, int y) {
int xx = findRoot(x);
int yy = findRoot(y);
if (xx != yy) {
p[xx] = yy;
}
}
int getInt(char x) {
return x - 'a';
}
bool equationsPossible(vector<string>& equations) {
p = new int[26];
for (int i=0;i<26;i++) {
p[i] = i;
}
vector<pair<int, int>> no_equal;
int e_size = equations.size();
for (int i=0;i<e_size;i++) {
string str = equations[i];
if (str[1] == '!') {
no_equal.push_back(make_pair(getInt(str[0]), getInt(str[3])));
}
else {
combine(getInt(str[0]), getInt(str[3]));
}
}
e_size = no_equal.size();
for (int i=0;i<e_size;i++) {
int xx = findRoot(no_equal[i].first);
int yy = findRoot(no_equal[i].second);
if (xx == yy) return false;
}
return true;
}
};
如果有问题,欢迎大家指正!!!