哈希表(unordered_map应用)

 

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        /* 根据返回值定义存储结果的变量 */
        vector<vector<string>> result;

        unordered_map<string, vector<string>> map;
        for (string& str: strs) {
            string key = str;
            /* 将串排序后便于同一作为键 */
            sort(key.begin(), key.end());
            /* 将相同键值的字符串放入vector容器中 */
            map[key].push_back(str);//emplace_back
        }
        /* 取出相同键值的vector */
        for (auto it = map.begin(); it != map.end(); ++it)
            result.push_back(it->second);

        return result;
    }
};

知识点:auto原理是根据后面的值来推测auto的类型,其实就是简化初始化。

unordered_map底层的原理就是哈希表

思路:将每个字符串排序,排序后字符串相同的肯定是字母异位词,将相同的键值的字符串放入同一个vector容器当中。

我先开始想法(超时)

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> res;
        if (s.size() < p.size()) {
            return res;
        }
        unordered_map<string,vector<int>> map;
        int slowIndex = 0;
        int fastIndex = p.size() - 1;
        while (fastIndex < s.size()) {
            string temp = s.substr(slowIndex,p.size());
            sort(temp.begin(), temp.end());
            map[temp].push_back(slowIndex);
            slowIndex++;
            fastIndex++;
        }
        sort(p.begin(),p.end());
        return map[p];
    }
};

 正确思路

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int sLen = s.size(), pLen = p.size();

        if (sLen < pLen) {
            return vector<int>();
        }

        vector<int> ans;
        vector<int> sCount(26);
        vector<int> pCount(26);
        for (int i = 0; i < pLen; ++i) {
            ++sCount[s[i] - 'a'];
            ++pCount[p[i] - 'a'];
        }

        if (sCount == pCount) {
            ans.emplace_back(0);
        }

        for (int i = 0; i < sLen - pLen; ++i) {
            --sCount[s[i] - 'a'];
            ++sCount[s[i + pLen] - 'a'];

            if (sCount == pCount) {
                ans.emplace_back(i + 1);
            }
        }

        return ans;
    }
};

思想:利用哈希表和滑动窗口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值