Leetcode初学——等式方程的可满足性 并查集思想

好久没写博客了,绝对不是因为博主偷懒了,只是春夏交际太过乏累了(理不直,气也壮).jpg

题目

 

分析

这道题是并查集类型的题目

我们可以先找出各点之间已经存在的等式关系

以这道题为例  ,作图

输入["a==b","e==c","b==c","a!=e"]

a==b

                                                    

e==c

                              

b==c

                                        

最后一个a!=e就是我们的判断条件

我们可以发现根据前面三条等式,a,b,c,e都是相等的,所以a!=e显然是不满足的,所以最后结果就会返回false

 

我个人认为的并查集问题,就是将多个点进行连线,让他们之间关联起来。

像上面的例子,ab关联,ce分别关联,a又与e关联,就意味着abce都关联起来。

这时候就会有一个问题出现:在图上关联只要画条线就好了,那在代码中要怎么表示呢?

我在这里用的是一个二维的列表来表示,这也使得整体的效率相当的低下,如果要提高效率的话,我认为要从点与点的关联来入手

 

代码

class Solution {
    public boolean equationsPossible(String[] strs) {
        List<List<Character>> lists=new ArrayList<>();
        for (String str:strs){
            if (str.charAt(1)=='='){
                List<Character> list1=null;
                List<Character> list2=null;
                char a=str.charAt(0);
                char b=str.charAt(3);
                for (List list:lists){
                    if (list.contains(a) && !list.contains(b)){
                        list1=list;
                    }
                    if (list.contains(b) && !list.contains(a)){
                        list2=list;
                    }
                }
                //各种情况的关联的判断
                if (list1==null && list2==null){
                    lists.add(new ArrayList<>());
                    lists.get(lists.size()-1).add(a);
                    lists.get(lists.size()-1).add(b);
                }else if(list1!=null && list2==null){
                    list1.add(b);
                }else if(list1==null && list2!=null){
                    list2.add(a);
                }else if (list1 !=null && list2!=null){
                    list1.addAll(list2);
                }
            }
        }

        for (String str:strs){
            if (str.charAt(1)=='!'){
                char a=str.charAt(0);
                char b=str.charAt(3);
                if (a==b) return false;
                for (List list:lists){
                    if (list.contains(a) && list.contains(b))
                        return false;
                }
            }
        }

        return true;

    }
}

 

结果

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值