难度简单158收藏分享切换为英文接收动态反馈
句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。
如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。
给你两个 句子 s1
和 s2
,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。
示例 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
s1
和s2
由小写英文字母和空格组成s1
和s2
都不含前导或尾随空格s1
和s2
中的所有单词间均由单个空格分隔
通过次数42,223提交次数58,618
本题的解答思路其实很简单,先分隔字符串为单词数组,单词查重即可,剩下就是返回值。
class Solution {
public:
vector<string> split(const string& str, const string& delim) {
vector<string> res;
if("" == str) return res;
//先将要切割的字符串从string类型转换为char*类型
char * strs = new char[str.length() + 1] ; //不要忘了
strcpy(strs, str.c_str());
char * d = new char[delim.length() + 1];
strcpy(d, delim.c_str());
char *p = strtok(strs, d);
while(p) {
string s = p; //分割得到的字符串转换为string类型
res.push_back(s); //存入结果数组
p = strtok(NULL, d);
}
delete[] d;
delete[] strs;
return res;
}
vector<string> uncommonFromSentences(string s1, string s2) {
string ss=s1+" "+s2;
vector<string> rets;
rets=split(ss," "); //分隔字符串
vector<string> strcp; //记录重复的字符串,可以使用map,统计字符串次数
for(int i=0;i<rets.size();i++)
{
for(int j=i+1;j<rets.size();j++)
{
if(rets[i]==rets[j])
{
strcp.push_back(rets[i]);
}
}
}
vector<string> rets11;
// 重新遍历,判断是否有重复的,有重复的就置空,不重复的就返回
for(auto si:rets)
{
for(auto scp:strcp)
{
if(si==scp)
{
si="";
break;
}
}
if(si!="")
rets11.push_back(si);
}
return rets11;
}
};
执行结果:
通过
显示详情
添加备注
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:7 MB, 在所有 C++ 提交中击败了5.08%的用户
通过测试用例:55 / 55
就是内存占用有点高啊。