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