好久没写博客了,绝对不是因为博主偷懒了,只是春夏交际太过乏累了(理不直,气也壮).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;
}
}
结果