题目描述:
一开始的思路(有个很大的问题):遍历整个数组,将每个字符进行分组,如果左右两个字符都有分组那么就比较分组是否相同,如果有一个没有分组那么就进行分组。
按照一开始的思路进行编码。
class Solution {
public static void main(String[] args) {
String[] a={"c==c","f!=a","f==b","b==c"};
System.out.println(new Solution().equationsPossible(a));
}
public boolean equationsPossible(String[] equations) {
boolean result=true;
int[] groups=new int[26];
int group=1;
for (int i=0;i<equations.length;i++){
if (equations[i].charAt(1)=='='){//等于号
if (groups[equations[i].charAt(0)-'a']==0){//左无分组
if (groups[equations[i].charAt(3)-'a']==0){//左无分组右无分组
groups[equations[i].charAt(0)-'a']=group;
groups[equations[i].charAt(3)-'a']=group;
group++;
}else {//左无分组右有分组
groups[equations[i].charAt(0)-'a']=groups[equations[i].charAt(3)-'a'];
}
}else {//左有分组
if (groups[equations[i].charAt(3)-'a']==0){//左有分组右无分组
groups[equations[i].charAt(3)-'a']=groups[equations[i].charAt(0)-'a'];
}else {//左有分组右有分组
if (groups[equations[i].charAt(3)-'a']!=groups[equations[i].charAt(0)-'a']){
result=false;
break;
}
}
}
}else {//不等号
if (equations[i].charAt(0)==equations[i].charAt(3)){
result=false;
break;
}
if (groups[equations[i].charAt(0)-'a']==0){//左无分组
if (groups[equations[i].charAt(3)-'a']==0){//左无分组右无分组
groups[equations[i].charAt(0)-'a']=group;
group++;
groups[equations[i].charAt(3)-'a']=group;
group++;
}else {//左无分组右有分组
groups[equations[i].charAt(0)-'a']=group;
group++;
}
}else {//左有分组
if (groups[equations[i].charAt(3)-'a']==0){//左有分组右无分组
groups[equations[i].charAt(3)-'a']=group;
group++;
}else {//左有分组右有分组
if (groups[equations[i].charAt(0)-'a']==groups[equations[i].charAt(3)-'a']){
result=false;
break;
}
}
}
}
}
return result;
}
}
但是解答并不对,给了我一个[“cc",“f!=a”,"fb”,“b==c”]的样例。为什么上面的不对呢。原因是当进行到不等号时左右都进行了分组,但是到了后面等号的时候,并没有把分组合并。但是怎么进行分组的合并呢,想了半天也没有想到办法,于是看了下官方的解答发现思路有问题。首先应该进行一次遍历,将所有equations[i].charAt(1)为=的都先分组。原因:等号判断在没有不等号存在时候是可以绝对成立的。之后在进行剩下的不等号的判定。
在等号判定的时候还需要注意还是存在分组的情况,这时候只需要遍历一次分组数组,合并分组。由于先进行等号的判定,没有不等号的干扰,此时合并分组是可行的。
附上官方的代码:
class Solution {
public boolean equationsPossible(String[] equations) {
int length = equations.length;
int[] parent = new int[26];
for (int i = 0; i < 26; i++) {
parent[i] = i;
}
for (String str : equations) {
if (str.charAt(1) == '=') {
int index1 = str.charAt(0) - 'a';
int index2 = str.charAt(3) - 'a';
union(parent, index1, index2);
}
}
for (String str : equations) {
if (str.charAt(1) == '!') {
int index1 = str.charAt(0) - 'a';
int index2 = str.charAt(3) - 'a';
if (find(parent, index1) == find(parent, index2)) {
return false;
}
}
}
return true;
}
public void union(int[] parent, int index1, int index2) {
parent[find(parent, index1)] = find(parent, index2);
}
public int find(int[] parent, int index) {
while (parent[index] != index) {
parent[index] = parent[parent[index]];
index = parent[index];
}
return index;
}
}