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;
}
相关推荐
JieE21214 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2122 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2123 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2123 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050733 天前
(一)小红的数组操作
算法·编程语言