737 sentence similarity

https://leetcode.com/problems/sentence-similarity-ii/

Praise the union find!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

class Solution {
    private int[] sizes;
    private int[] leaders;
    public boolean areSentencesSimilarTwo(String[] sentence1, String[] sentence2, List<List<String>> similarPairs) {
        if (sentence1.length != sentence2.length) {
            return false;
        }
        int n = similarPairs.size();
        sizes = new int[n];
        leaders = new int[n];
        for (int i = 0; i < n; i++) {
            sizes[i] = 1;
            leaders[i] = i;
        }
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            List<String> pair = similarPairs.get(i);
            for (String word : pair) {
                Integer index = map.get(word);
                if (index == null) {
                    map.put(word, i);
                } else {
                    union(index, i);
                }
            }
        }
        for (int i = 0; i < sentence1.length; i++) {
            String s1 = sentence1[i];
            String s2 = sentence2[i];
            if (s1.equals(s2)) continue;
            if (!map.containsKey(s1) || !map.containsKey(s2)) {
                return false;
            }
            if (find(map.get(s1)) != find(map.get(s2))) {
                return false;
            }
        }
        return true;
    }
    private void union(int a, int b) {
        int la = find(a);
        int lb = find(b);
        if (la == lb) return;
        if (sizes[la] >= sizes[lb]) {
            sizes[la] += sizes[lb];
            leaders[lb] = la;
        } else {
            sizes[lb] += sizes[la];
            leaders[la] = lb;
        }
    }
    
    private int find(int a) {
        if (leaders[a] == a) {
            return a;
        }
        return leaders[a] = find(leaders[a]);
    }
}

Last updated