两句话中的不常见单词

标签: 哈希表 字符串

难度: Easy

句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。

如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的

给你两个 句子 s1s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。

示例 1:

输入:s1 = "this apple is sweet", s2 = "this apple is sour"
输出:["sweet","sour"]

示例 2:

输入:s1 = "apple apple", s2 = "banana"
输出:["banana"]

提示:

  • 1 <= s1.length, s2.length <= 200
  • s1s2 由小写英文字母和空格组成
  • s1s2 都不含前导或尾随空格
  • s1s2 中的所有单词间均由单个空格分隔

Submission

运行时间: 23 ms

内存: 16.0 MB

class Solution:
    def uncommonFromSentences(self, s1: str, s2: str) -> List[str]:
        d = Counter(s1.split()) + Counter(s2.split())
        return [w for w in d if d[w] == 1]

Explain

此题解的思路是使用Python内置的Counter类来统计两个句子中每个单词出现的次数。首先,将两个句子s1和s2分别按空格分割成单词列表,然后分别对这两个列表使用Counter进行计数。最后,将这两个Counter对象相加,得到一个新的Counter对象,其中包含了两个句子中所有单词的出现次数。接着,遍历这个Counter对象,将出现次数为1的单词加入结果列表中。这些单词就是题目中所说的不常见单词。

时间复杂度: O(n + m)

空间复杂度: O(n + m)

class Solution:
    def uncommonFromSentences(self, s1: str, s2: str) -> List[str]:
        # 使用Counter统计s1和s2中每个单词出现的次数
        d = Counter(s1.split()) + Counter(s2.split())
        # 返回出现次数为1的单词列表
        return [w for w in d if d[w] == 1]

Explore

使用`Counter`对象相加而不是先合并两个句子后再计数的主要原因是效率和简洁性。通过分别对两个句子计数,然后将结果相加,可以避免在合并过程中处理较长字符串所需的额外资源和时间。此外,`Counter`的相加操作内部是优化过的,可以快速合并两个计数器的数据,这比手动合并字符串和重新计数要高效。

是的,`Counter`对象相加会正确处理两个句子中相同单词的计数。当两个`Counter`对象相加时,Python会对两个计数器中的相同键(即单词)进行值相加操作。例如,如果一个单词在一个句子中出现了2次,在另一个句子中出现了1次,相加后这个单词的计数将是3。这确保了单词的总出现次数被正确统计。

是的,这种方法依然有效。如果两个句子中包含相同的单词(如'apple'),每个句子中该单词的出现次数首先会被各自的`Counter`对象计算。然后,这两个`Counter`对象相加时,相同单词的出现次数会累加。最后,只有那些总计出现一次的单词会被选取作为不常见单词。因此,如果'apple'在任一句子中出现多次,则它的总计次数大于1,不会被认为是不常见单词。

题解中没有特别提到对特殊字符或数字的处理。`Counter`类会将句子中的所有元素(包括单词、数字、特殊字符等)按照空格分隔后直接统计。这意味着如果句子中包含特殊字符或数字,它们也会被视为单独的元素进行计数。如果特殊字符或数字仅出现一次,则它们也会被列入不常见单词列表中。为了只处理纯粹的单词,可能需要在计数之前对句子进行清洗,去除或分离特殊字符和数字。