題目地址:
https://leetcode.com/problems/sentence-similarity/
給定一個列表,列表中每個位置都是一個長爲的字符串數組,規定數組內的字符串是”相似的“。再給定兩個字符串數組,問這兩個數組是否對應位置的字符串都相似。注意,規定”相似關係“不具有傳遞性,只具有對稱性。如果兩個數組長度不等則直接返回false;並且如果對應位置上的字符串相等,也視爲相似,不必含在列表裏。
import java.util.*;
public class Solution {
class Pair {
String s1, s2;
public Pair(String s1, String s2) {
// 爲了保證含相同字符串的兩個Pair就相等,這裏要規定s1 < s2;
if (s1.compareTo(s2) <= 0) {
this.s1 = s1;
this.s2 = s2;
} else {
this.s1 = s2;
this.s2 = s1;
}
}
@Override
public boolean equals(Object p) {
Pair pair = (Pair) p;
return s1.equals(pair.s1) && s2.equals(pair.s2);
}
@Override
public int hashCode() {
return Objects.hash(s1, s2);
}
}
public boolean areSentencesSimilar(String[] words1, String[] words2, List<List<String>> pairs) {
if (words1.length != words2.length) {
return false;
}
Map<String, Integer> map = new HashMap<>();
Set<Pair> set = new HashSet<>();
for (List<String> pair : pairs) {
set.add(new Pair(pair.get(0), pair.get(1)));
}
for (int i = 0; i < words1.length; i++) {
// 特判,如果相等則符合條件,略過
if (words1[i].equals(words2[i])) {
continue;
}
// 不相似則返回false
if (!set.contains(new Pair(words1[i], words2[i]))) {
return false;
}
}
return true;
}
}
時空複雜度,爲單詞個數,爲單詞最長長度。
注意:
在Pair類裏面,不能只把equals改寫爲return (s1.equals(pair.s1) && s2.equals(pair.s2)) || (s1.equals(pair.s2) && s2.equals(pair.s1));
,因爲哈希表在存pair的時候會先算哈希值,哈希值不等就直接判定爲不等了,不會再調用equals,這回造成判定兩個單詞是否相似的時候,兩個單詞的順序會影響判斷。比較好的方法是初始化pair的時候就直接強行規定s1 < s2
。