两句话中的不常见单词
难度:
标签:
题目描述
代码结果
运行时间: 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对象相加的操作,这是否会处理好两个句子中相同单词的计数?具体是如何实现的?
▷🦆
如果两个句子中包含重复的单词,这种方法是否仍然有效?例如s1和s2中都包含重复的'apple'单词。
▷🦆
题解中是否考虑了句子中可能包含的特殊字符或数字,这些会对结果产生怎样的影响?
▷