990. 等式方程的可满足性
给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。
只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。
解题思路: 解此题时,感觉考察的是图和并查集的知识,然后看了一眼标签,判断的没错,但是写代码时,发现思考的点有点混乱,然后看了一下官方的并查集解题思路,尝试着根据解题思路写了一下代码。先写一个标准的并查集模型,然后对等式方程做两次遍历,第一次遍历"==",将相等的元素进行合并,至此并查集就构建完毕了,然后再进行第二次遍历,遍历"!=",遍历的过程中,查找这两个元素的parent是否相同,若相同则直接返回false。
class UnionFind {
public:
UnionFind() {
uf.resize(26);
for (int i = 0; i < 26; ++i) uf[i] = i;
}
int Find(int a) {
while (uf[a] != a) a = uf[a];
return a;
}
void Union(int a, int b) {
int pa = Find(a);
int pb = Find(b);
if (pa < pb) uf[pb] = pa;
else uf[pa] = pb;
}
private:
vector<int> uf;
};
class Solution {
public:
bool equationsPossible(vector<string>& equations) {
UnionFind uf;
for (auto equation : equations) {
if (equation[1] == '=' && equation[0] != equation[3]) {
uf.Union(equation[0] - 'a', equation[3] - 'a');
}
}
for (auto equation : equations) {
if (equation[1] == '!') {
int p1 = uf.Find(equation[0] - 'a');
int p2 = uf.Find(equation[3] - 'a');
if (p1 == p2) return false;
}
}
return true;
}
};
————————————
参考资料:
https://leetcode-cn.com/problems/satisfiability-of-equality-equations/solution/deng-shi-fang-cheng-de-ke-man-zu-xing-by-leetcode-/