题目描述:
给定两个句子 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
都只包含空格和小写字母。
要完成的函数:
vector<string> uncommonFromSentences(string A, string B)
说明:
1、做久了medium的题目,回过头来做一道新出的easy题,感觉真是十分畅爽啊。
这道题给定两个字符串A和B,A和B中只包含空格和小写字母,要求找出在A中只出现一次并且在B中没有出现的单词,同时再找出在B中只出现一次并且在A中没有出现的单词。
把这些单词插入到vector中,最终返回包含string格式的vector。
2、其实考虑一下,就会发现这道题其实是要找只出现一次的单词。
如果某个单词在A中出现了两次,那么不用返回。如果某个单词在B中出现了两次,也不用返回。
如果某个单词在A中出现了一次,在B中出现了一次,那么也不用返回。
所以我们需要返回的只是 只出现一次的单词。
代码如下:(附详解)
vector<string> uncommonFromSentences(string A, string B)
{
unordered_map<string,int>m1;//定义成unordered_map不需要排序,更省时间
vector<int>res;//最终要返回的vector
int i=0,j=0;
while(j<=A.size())//把A中每一个单词切分出来
{
if(A[j]==' '||A[j]==' ')
{
m1[A.substr(i,j-i)]++;//默认初始化为0,所以直接++就好
i=j+1;//i更新到j的下一位,也就是下一个单词的首位
}
j++;
}
i=0,j=0;
while(j<=B.size())//同样操作,把B中每一个单词切分出来
{
if(B[j]==' '||B[j]==' ')
{
m1[B.substr(i,j-i)]++;
i=j+1;
}
j++;
}
for(auto iter=m1.begin();iter<m1.end();iter++)//遍历一遍map,看一下哪一个单词出现次数是1
{
if(iter->second==1)
res.push_back(iter->first);//把这个单词插入到vector中
}
return res;
}
上述代码实测0ms,beats 100.00% of cpp submissions。