leetcode.884——字符串分割(substr),哈希(unordered_map)的练习

8 篇文章 0 订阅
4 篇文章 0 订阅

884. 两句话中的不常见单词

句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。

如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 

给你两个 句子 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 中的所有单词间均由单个空格分隔

两种解法 第一种比较普遍 第二种运用substr进行优化

/*
思路:
  通过题意可知,不常见单词即为出现次数为1次的单词,具体方法如下
 1. 将A和B两个字符串拼接,存于s中
 2. 从s中分离出单词,保存在vector vRet中
 3. 使用unordered_map统计vRet中每个单词出现的次数
 4. 遍历unordered_map,将出现一次的单词保存在vRet中
 5. 返回vRet
*/
class Solution {
public:
    vector<string> uncommonFromSentences(string A, string B) {
        // 将两个语句拼接
        string s = A + " " + B;
        
        // 分离单词
        vector<string> vRet;
        for(size_t i = 0; i < s.size(); ++i)
        {
            string temp;
            while(i < s.size() && s[i] != ' ')
            {
                temp += s[i];
                ++i;
            }

            vRet.push_back(temp);
        }

        // 统计每个单词出现的次数
        unordered_map<string, int> m;
        for(auto e : vRet)
            m[e]++;
        
        vRet.clear();

        // 将出现一次的单词保存在vRet中
        for(auto e : m)
        {
            if(e.second == 1)
                vRet.push_back(e.first);
        }

        return vRet;
    }
};

第二种解法:

class Solution {
public:
    vector<string> uncommonFromSentences(string s1, string s2) {
        string s = s1+" "+s2;
        unordered_map<string,int> m;

        int i = 0;
        while(1)//字符串分割
        {
            i = 0;
            while(s[i]!=' '&&i<s.size())
            {
                i++;
            }
            m[s.substr(0,i)]++;
            if(i<s.size())
            {
                s=s.substr(i+1,s.size()-i);
            }
            else break;
        }
        vector<string> res;
        for(auto e:m)
        {
            if(e.second==1)
            {
                res.push_back(e.first);
            }
        }
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挣扎的泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值