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

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 uncommonFromSentences(string A, string B) {
        // 将两个语句拼接
        string s = A + " " + B;
        
        // 分离单词
        vector 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 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 uncommonFromSentences(string s1, string s2) {
        string s = s1+" "+s2;
        unordered_map m;

        int i = 0;
        while(1)//字符串分割
        {
            i = 0;
            while(s[i]!=' '&&i res;
        for(auto e:m)
        {
            if(e.second==1)
            {
                res.push_back(e.first);
            }
        }
        return res;
    }
};

你可能感兴趣的:(哈希,c++练习,每日一题,哈希算法,算法)