【Leetcode】734. Sentence Similarity

題目地址:

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

給定一個列表,列表中每個位置都是一個長爲22的字符串數組,規定數組內的字符串是”相似的“。再給定兩個字符串數組,問這兩個數組是否對應位置的字符串都相似。注意,規定”相似關係“不具有傳遞性,只具有對稱性。如果兩個數組長度不等則直接返回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;
    }
}

時空複雜度O(nl)O(nl)nn爲單詞個數,ll爲單詞最長長度。

注意:
在Pair類裏面,不能只把equals改寫爲return (s1.equals(pair.s1) && s2.equals(pair.s2)) || (s1.equals(pair.s2) && s2.equals(pair.s1));,因爲哈希表在存pair的時候會先算哈希值,哈希值不等就直接判定爲不等了,不會再調用equals,這回造成判定兩個單詞是否相似的時候,兩個單詞的順序會影響判斷。比較好的方法是初始化pair的時候就直接強行規定s1 < s2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章