Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- public class Main {
- public static void main(String args[])
- {
- List<String> input = new ArrayList<>();
- input.add("A,B,");
- input.add("A,B,C");
- input.add("D,,F");
- input.add(",B,C");
- input.add("D,E,F");
- List<List<Integer>> res = matchRecords(input);
- for (int i = 0; i < res.size(); i++) {
- for (int j = 0; j < res.size(); j++) {
- System.out.print(res.get(i).get(j) + " ");
- }
- System.out.println();
- }
- }
- public static List<List<Integer>> matchRecords(List<String> input) {
- List<String[]> inputs = new ArrayList<>();
- for (String p : input){
- String[] s = p.split(",", -1);
- inputs.add(s);
- }
- UnionFind uf = new UnionFind(inputs.size());
- for (int i = 0; i < inputs.size(); i++) {
- for (int j = i + 1; j < inputs.size(); j++) {
- if (match(inputs.get(i), inputs.get(j))) {
- uf.union(i, j);
- }
- }
- }
- List<List<Integer>> res = new ArrayList<>();
- for (int i = 0; i < inputs.size(); i++) {
- List<Integer> next = new ArrayList<>();
- for (int j = 0; j < inputs.size(); j++) {
- if (i == j || uf.find(i) == uf.find(j)) {
- next.add(1);
- } else {
- next.add(0);
- }
- }
- res.add(next);
- }
- return res;
- }
- public static boolean match(String[] s1, String[] s2) {
- for (int i = 0; i < s1.length; i++) {
- if (s1[i].length() > 0 && s1[i].equals(s2[i])) {
- return true;
- }
- }
- return false;
- }
- private static class UnionFind {
- private int[] parent;
- private int components;
- private int[] size;
- UnionFind(int n) {
- parent = new int[n];
- size = new int[n];
- components = n;
- for (int i = 0; i < n; i++) {
- parent[i] = i;
- size[i] = 1;
- }
- }
- void union(int p, int q) {
- int parentP = find(p);
- int parentQ = find(q);
- if (parentP == parentQ) {
- return;
- }
- if (size[parentP] < size[parentQ]) {
- parent[parentP] = parentQ;
- size[parentQ] += size[parentP];
- } else {
- parent[parentQ] = parentP;
- size[parentP] += size[parentQ];
- }
- components--;
- }
- int find(int p) {
- while (p != parent[p]) {
- p = parent[p];
- }
- return p;
- }
- int getComponents() {
- return components;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement