句子相似性

Submission

运行时间: 20 ms

内存: 16.0 MB

class Solution:
    def areSentencesSimilar(self, sentence1: List[str], sentence2: List[str], similarPairs: List[List[str]]) -> bool:
        if len(sentence1) != len(sentence2):
            return False
        
        pairs = [[s1,s2] for s1,s2 in zip(sentence1,sentence2)]
        for pair in pairs:
            if (pair[0] == pair[1]) or (pair in similarPairs) or ([pair[1],pair[0]] in similarPairs):
                pass
            else:
                return False
            
        return True

Explain

该题解的思路是先判断两个句子的长度是否相等,如果不等则直接返回 False。然后将两个句子中对应位置的单词组成一个pair,遍历所有pairs,对于每个pair,如果两个单词相同,或者该pair在similarPairs中,或者该pair颠倒顺序后在similarPairs中,则认为该pair是similar的。如果所有pairs都满足上述条件,则返回 True,否则返回 False。

时间复杂度: O(nm)

空间复杂度: O(n)

class Solution:
    def areSentencesSimilar(self, sentence1: List[str], sentence2: List[str], similarPairs: List[List[str]]) -> bool:
        # 判断两个句子的长度是否相等,如果不等则直接返回 False
        if len(sentence1) != len(sentence2):
            return False
        
        # 将两个句子中对应位置的单词组成一个 pair
        pairs = [[s1,s2] for s1,s2 in zip(sentence1,sentence2)]
        # 遍历所有 pairs
        for pair in pairs:
            # 如果两个单词相同,或者该 pair 在 similarPairs 中,或者该 pair 颠倒顺序后在 similarPairs 中,则认为该 pair 是 similar 的
            if (pair[0] == pair[1]) or (pair in similarPairs) or ([pair[1],pair[0]] in similarPairs):
                pass
            else:
                return False
            
        return True

Explore

在逻辑实现中,similarPairs中的重复元素对不会影响算法的结果。算法检查每个单词对是否存在于similarPairs中,重复的元素对只是增加了存储空间的使用,但不会影响结果的正确性。如果对性能和空间有较高要求,可以在处理前将similarPairs转换为一个集合(set),这样可以自动去除重复项,同时查找效率更高。

选择在遍历pairs时进行检查的简单性和直接性是一个因素。尽管使用更高效的数据结构(如集合或哈希表)可以提高查找效率,但这会增加代码的复杂性和额外的预处理时间。在数据量不大时,直接遍历和检查可能在性能上足够高效。然而,对于大数据量或高效率要求的情况,确实推荐使用集合或哈希表来存储和快速检查similarPairs。

算法的实现确实暗示了similarPairs应该包含所有可能的顺序,以确保无论单词对的顺序如何,都能正确判断其相似性。在实际应用中,这意味着如果一个单词对被认为是相似的,那么其颠倒顺序的对也应该被包含在similarPairs中。这样可以避免在运行时重复检查两种顺序,提高效率。

这种方法的确会导致提前退出,但这是算法设计的意图。算法的目标是判断两个句子是否完全相似,即所有对应的单词对都必须是相似的。如果任一对单词不符合相似性要求,整个句子就不可能完全相似,因此提前退出是合适的,这样可以避免不必要的进一步检查,提高算法效率。