package com.interview.books.question300;
import java.util.*;
/**
* Created_By: stefanie
* Date: 14-12-17
* Time: 下午10:03
*/
public class TQ40_CombineSetWithInteractions {
public List<Set<String>> combine(List<Set<String>> input) {
TQ2_UnionFind uf = new TQ2_UnionFind(input.size());
for(int i = 0; i < input.size() - 1; i++){
for(int j = i + 1; j < input.size(); j++){
if(haveIntersection(input.get(i), input.get(j))){
uf.union(i, j);
}
}
}
HashMap<Integer, Set<String>> map = new HashMap<>();
for(int i = 0; i < input.size(); i++){
int root = uf.find(i);
if(map.containsKey(root)){
map.get(root).addAll(input.get(i));
} else {
map.put(root, input.get(i));
}
}
List<Set<String>> result = new ArrayList<>();
for(Set<String> set : map.values()){
result.add(set);
}
return result;
}
private boolean haveIntersection(Set<String> s1, Set<String> s2){
if(s1.size() < s2.size()) return haveIntersection(s2, s1);
for(String str : s2){
if(s1.contains(str)) return true;
}
return false;
}
public static void main(String[] args){
List<Set<String>> input = new ArrayList<Set<String>>();
Set<String> set = new HashSet<String>();
set.add("aa");
set.add("bb");
set.add("cc");
input.add(set);
set = new HashSet<String>();
set.add("dd");
set.add("bb");
input.add(set);
set = new HashSet<String>();
set.add("hh");
input.add(set);
set = new HashSet<String>();
set.add("uu");
set.add("jj");
input.add(set);
set = new HashSet<String>();
set.add("dd");
set.add("kk");
input.add(set);
TQ40_CombineSetWithInteractions combiner = new TQ40_CombineSetWithInteractions();
List<Set<String>> result = combiner.combine(input);
for(Set<String> item : result){
System.out.println(item);
boolean flag = false;
if(item.size() == 1 && item.contains("hh")) flag = true;
else if(item.size() == 2 && item.contains("uu") && item.contains("jj")) flag = true;
else if(item.size() == 5 && item.contains("aa") && item.contains("bb")
&& item.contains("cc") && item.contains("dd") && item.contains("kk")) flag = true;
System.out.println(flag);
}
}
}