class uf{
private:
int father[26];
public:
uf() { //初始化
for(int i = 0; i < 26; i++) {
father[i] = i;
}
}
int find(int x) {
/*递归
if(x == father[x]) return x;
return find(father[x]);
*/
while(x != father[x]) {
father[x] = father[father[x]]; //路径压缩
x = father[x];
}
return x;
}
void unite(int index1, int index2) {
int fa1 = find(index1);
int fa2 = find(index2);
if(fa1 != fa2) {
father[fa1] = fa2;
}
}
};
class Solution {
public:
bool equationsPossible(vector<string>& equations) {
if(equations.size() == 0) return true;
uf myuf;
//等于,则都应属于同一个集合,把等于两边的都放一个集合
//然后看不等于两边的元素,是不是出现在同一个集合,如果有在一个集合的就是false
for(int i = 0; i < equations.size(); i++) {
if(equations[i][1] == '=') {
int index1 = equations[i][0] - 'a';
int index2 = equations[i][3] - 'a';
myuf.unite(index1, index2);
}
}
for(int i = 0; i < equations.size(); i++) {
if(equations[i][1] == '!') {
int index1 = equations[i][0] - 'a';
int index2 = equations[i][3] - 'a';
if(myuf.find(index1) == myuf.find(index2)) return false;
}
}
return true;
}
};
LeetCode990. 等式方程的可满足性(并查集)
最新推荐文章于 2024-09-22 15:43:32 发布