夯实算法-等式方程的可满足性

2022-11-28  本文已影响0人  在中国喝Java

题目:LeetCode

给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:"a==b" 或 "a!=b"。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。

只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。

示例 1:

输入:["a==b","b!=a"]
输出:false
解释:如果我们指定,a = 1 且 b = 1,那么可以满足第一个方程,但无法满足第二个方程。没有办法分配变量同时满足这两个方程。
复制代码

示例 2:

输入: ["b==a","a==b"]
输出: true
解释: 我们可以指定 a = 1 且 b = 1 以满足满足这两个方程。
复制代码

示例 3:

输入: ["a==b","b==c","a==c"]
输出: true
复制代码

示例 4:

输入: ["a==b","b!=c","c==a"]
输出: false
复制代码

示例 5:

输入: ["c==c","b==d","x!=z"]
输出: true
复制代码

提示:

解题思路

创建一个26*26的数组,用来存取字母间的关系:

代码实现

public boolean equationsPossible(String[] equations) {
    int[][] relation = new int[26][26];
    for(int i = 0; i < 26; i++) relation[i][i] = 1;
    for(int i = 0; i < equations.length; i++){
        char flag = equations[i].charAt(1);
        int x = equations[i].charAt(0) - 'a';
        int y = equations[i].charAt(3) - 'a';
        if(flag == '!' && relation[x][y] != 1){
            relation[x][y] = -1;
            relation[y][x] = -1;
        }
        else if(flag == '=' && relation[x][y] != -1) {
            relation[x][y] = 1;
            relation[y][x] = 1;
        }
        else return false;
    }

    for(int i = 0; i < 26; i++){
        for(int j = 0; j < 26; j++){          
            for(int k = 0; k < 26; k++){
                if(relation[i][j] == 1 && relation[j][k] == 1){
                    if(relation[i][k] == -1) return false;
                    else {
                        relation[i][k] = 1;
                        relation[k][i] = 1;
                    }    
                }
            }
        }
    }
    return true;
}
复制代码

复杂度分析

上一篇 下一篇

猜你喜欢

热点阅读