LeetCode //C - 990. Satisfiability of Equality Equations

990. Satisfiability of Equality Equations

You are given an array of strings equations that represent relationships between variables where each string equationsi is of length 4 and takes one of two different forms: "xi==yi" or "xi!=yi".Here, xi and yi are lowercase letters (not necessarily different) that represent one-letter variable names.

Return true if it is possible to assign integers to variable names so as to satisfy all the given equations, or false otherwise.

Example 1:

Input: equations = "a==b","b!=a"
Output: false
Explanation: If we assign say, a = 1 and b = 1, then the first equation is satisfied, but not the second.

There is no way to assign the variables to satisfy both equations.

Example 2:

Input: equations = "ba","ab"
Output: true
Explanation: We could assign a = 1 and b = 1 to satisfy both equations.

Constraints:
  • 1 <= equations.length <= 500
  • equationsi.length == 4
  • equationsi0 is a lowercase letter.
  • equationsi1 is either '=' or '!'.
  • equationsi2 is '='.
  • equationsi3 is a lowercase letter.

From: LeetCode

Link: 990. Satisfiability of Equality Equations


Solution:

Ideas:
  • Build groups using all "x==y" first (Union-Find / DSU).

  • Then for each "x!=y", if x and y end up in the same group → contradiction → false.

  • Otherwise, it's satisfiable → true.

Code:
c 复制代码
static int find(int parent[], int x) {
    if (parent[x] != x) parent[x] = find(parent, parent[x]);
    return parent[x];
}

static void unite(int parent[], int rank[], int a, int b) {
    int ra = find(parent, a);
    int rb = find(parent, b);
    if (ra == rb) return;

    if (rank[ra] < rank[rb]) {
        parent[ra] = rb;
    } else if (rank[ra] > rank[rb]) {
        parent[rb] = ra;
    } else {
        parent[rb] = ra;
        rank[ra]++;
    }
}

bool equationsPossible(char** equations, int equationsSize) {
    int parent[26], rank[26] = {0};

    for (int i = 0; i < 26; i++) parent[i] = i;

    // 1) Union all equalities.
    for (int i = 0; i < equationsSize; i++) {
        char *e = equations[i];
        if (e[1] == '=' && e[2] == '=') {
            int x = e[0] - 'a';
            int y = e[3] - 'a';
            unite(parent, rank, x, y);
        }
    }

    // 2) Check all inequalities against the union-find sets.
    for (int i = 0; i < equationsSize; i++) {
        char *e = equations[i];
        if (e[1] == '!' && e[2] == '=') {
            int x = e[0] - 'a';
            int y = e[3] - 'a';
            if (find(parent, x) == find(parent, y)) return false;
        }
    }

    return true;
}
相关推荐
Logic1012 小时前
C语言/数据结构字符串题解:按字符类型重排(数字→字母→符号)——三趟扫描稳定分区
c语言·数据结构·字符串·时间复杂度·计数排序·算法题·ascii
Logic1018 小时前
C语言/数据结构位运算题解:异或XOR找出学习计划中的“独特学习时间“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
wuminyu9 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
小蒋学算法9 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
荆棘鸟智能9 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
hhb_61810 小时前
AIRAGDebug:一键定位RAG链路异常
人工智能·python·算法
朝朝辞暮i11 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
苏打豆11 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人
FluxArt11 小时前
GPT Image 2.5 中文提示词教程:Flux Art 可复用模板
前端·gpt·算法
思麟呀12 小时前
位运算:从一个整数到一个集合
c语言·数据结构·c++·算法