两句话中的不常见单词(Uncommon Words from Two Sentences)java
题干
给定两个句子 A 和 B 。 (句子是一串由空格分隔的单词。每个单词仅由小写字母组成。)
如果一个单词在其中一个句子中只出现一次,在另一个句子中却没有出现,那么这个单词就是不常见的。
返回所有不常用单词的列表。
您可以按任何顺序返回列表。
示例 1:
输入:A = "this apple is sweet", B = "this apple is sour"
输出:["sweet","sour"]
示例 2:
输入:A = "apple apple", B = "banana"
输出:["banana"]
提示:
0 <= A.length <= 200
0 <= B.length <= 200
A 和 B 都只包含空格和小写字母。
分析
这是leetcode上周周赛的第一道题,其实这个思路很简单。
首先他要求在其中一个句子中出现一次,在另一个句子中没有出现,那么说白了就是在所有单词中只出现一次,这样的单词找出来就ok。我是用set集合,使用set集合的内容不重复的特性来判重。使用两个set集合,用一个集合将所有单词存进去一次(出现过的值),如果重复了就装进第二个集合(重复出现的值)中,最后将在第一个集合中出现的第二个集合里的值删掉就是最终的结果。
代码
public String[] uncommonFromSentences(String A, String B) {
String[] stringsA = A.split(" ");
//将所有单词记录一遍
Set<String> stringSet = new HashSet<>();
//记录重复的
Set<String> replace = new HashSet<>();
for (String a : stringsA) {
if (!stringSet.add(a)) {
replace.add(a);
}
}
String [] stringsB = B.split(" ");
for (String b : stringsB) {
if (!stringSet.add(b)) {
replace.add(b);
}
}
//从一遍中删除掉重复的
for (String rep : replace) {
if (stringSet.contains(rep)) {
stringSet.remove(rep);
}
}
//赋值给string数组
String[] result = new String[stringSet.size()];
int[] index = {0};
stringSet.forEach(s -> {
result[index[0]] = s;
index[0]++;
});
return result;
}