leetcode
leetcode 801 ~ 850
两句话中的不常见单词

两句话中的不常见单词

难度:

标签:

题目描述

代码结果

运行时间: 23 ms, 内存: 16.0 MB


/*
 * 思路:
 * 1. 将两个句子拆分成单词数组。
 * 2. 使用流处理将两个数组合并,并计算每个单词的出现次数。
 * 3. 过滤出只出现一次的单词。
 */
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class UncommonWordsStream {
    public static List<String> uncommonFromSentences(String s1, String s2) {
        // 将句子拆分成单词数组,并合并两个数组
        String[] words1 = s1.split(" ");
        String[] words2 = s2.split(" ");
        
        // 使用流处理计算单词出现次数
        Map<String, Long> countMap = Stream.concat(Arrays.stream(words1), Arrays.stream(words2))
                .collect(Collectors.groupingBy(word -> word, Collectors.counting()));
        
        // 过滤出只出现一次的单词
        return countMap.entrySet().stream()
                .filter(entry -> entry.getValue() == 1)
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
    }

    public static void main(String[] args) {
        String s1 = "this apple is sweet";
        String s2 = "this apple is sour";
        System.out.println(uncommonFromSentences(s1, s2));
    }
}

解释

方法:

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

时间复杂度:

O(n + m)

空间复杂度:

O(n + m)

代码细节讲解

🦆
在题解中,为什么选择使用`Counter`对象相加而不是合并两个句子后再统计单词出现次数?
使用`Counter`对象相加而不是先合并两个句子后再计数的主要原因是效率和简洁性。通过分别对两个句子计数,然后将结果相加,可以避免在合并过程中处理较长字符串所需的额外资源和时间。此外,`Counter`的相加操作内部是优化过的,可以快速合并两个计数器的数据,这比手动合并字符串和重新计数要高效。
🦆
对于Counter对象相加的操作,这是否会处理好两个句子中相同单词的计数?具体是如何实现的?
是的,`Counter`对象相加会正确处理两个句子中相同单词的计数。当两个`Counter`对象相加时,Python会对两个计数器中的相同键(即单词)进行值相加操作。例如,如果一个单词在一个句子中出现了2次,在另一个句子中出现了1次,相加后这个单词的计数将是3。这确保了单词的总出现次数被正确统计。
🦆
如果两个句子中包含重复的单词,这种方法是否仍然有效?例如s1和s2中都包含重复的'apple'单词。
是的,这种方法依然有效。如果两个句子中包含相同的单词(如'apple'),每个句子中该单词的出现次数首先会被各自的`Counter`对象计算。然后,这两个`Counter`对象相加时,相同单词的出现次数会累加。最后,只有那些总计出现一次的单词会被选取作为不常见单词。因此,如果'apple'在任一句子中出现多次,则它的总计次数大于1,不会被认为是不常见单词。
🦆
题解中是否考虑了句子中可能包含的特殊字符或数字,这些会对结果产生怎样的影响?
题解中没有特别提到对特殊字符或数字的处理。`Counter`类会将句子中的所有元素(包括单词、数字、特殊字符等)按照空格分隔后直接统计。这意味着如果句子中包含特殊字符或数字,它们也会被视为单独的元素进行计数。如果特殊字符或数字仅出现一次,则它们也会被列入不常见单词列表中。为了只处理纯粹的单词,可能需要在计数之前对句子进行清洗,去除或分离特殊字符和数字。

相关问题