美文网首页
hash+排序(k个字符重排/字母异位词分组)

hash+排序(k个字符重排/字母异位词分组)

作者: 1哥 | 来源:发表于2023-08-26 22:48 被阅读0次
image.png

要点:
(1)关键数据结构:hash-unordered_map,堆-priority_queue
(2) string 排序
我们一个字符串str,和一个整数k,让我们对字符串str重新排序,使得其中相同的字符之间的距离不小于k。哈希表,堆。
(1)一个哈希表来建立字符和其出现次数之间的映射:
unordered_map<char, int>
(2)然后需要一个堆来保存这每一堆映射,按照出现次数来排序:
priority_queue<pair<int, char>
(3) 然后如果堆不为空我们就开始循环,我们找出k和str长度之间的较小值,
(4) 然后从0遍历到这个较小值,对于每个遍历到的值,如果此时堆为空了,说明此位置没法填入字符了,返回空字符串,否则我们从堆顶取出一对映射,
(5) 然后把字母加入结果res中,此时映射的个数减1,如果减1后的个数仍大于0,则我们将此映射加入临时集合v中,同时str的个数len减1,遍历完一次,我们把临时集合中的映射对由加入堆中.
参见代码如下:

class Solution {
public:
    string rearrangeString(string str, int k) {
        if (k == 0) return str;
        string res;
        int len = (int)str.size();
        unordered_map<char, int> m;
        priority_queue<pair<int, char>> q;
        for (auto a : str) ++m[a];
        for (auto it = m.begin(); it != m.end(); ++it) {
            q.push({it->second, it->first});
        }
        while (!q.empty()) {
            vector<pair<int, int>> v;
            int cnt = min(k, len);
            for (int i = 0; i < cnt; ++i) {
                if (q.empty()) return "";
                auto t = q.top(); q.pop();
                res.push_back(t.second);
                if (--t.first > 0) v.push_back(t);
                --len;
            }
            for (auto a : v) q.push(a);
        }
        return res;
    }
};

字符串排序sort(string)


image.png

根据题意进行模拟,对每个字符串进行排序作为 key,从而实现相同的「变位词」对应同一个 key,使用哈希表进行统计即可。

要点:
关键数据结构:string, map
关键操作:
(1)string 排序,可以用sort(string.begin(), string.end() );
(2)hash map操作:以排序后的string 作为key, 排序前的string添加到vector<string>的数组中value;
(3)for 遍历map;

    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string,vector<string>> mp;
        for(auto i : strs)
        {
          string s=i;
          sort(s.begin(),s.end());
          mp[s].push_back(i);
        }
        vector<vector<string>> res;
        for(auto i:mp)
            res.push_back(i.second);
        return res;
    }

相关文章

  • LeetCode 字母异位词分组 Rust

    LeetCode 字母异位词分组 Rust 题目 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同...

  • leetCode进阶算法题+解析(六)

    字母异位词分组 题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例...

  • LeetCodeDay37 —— 字母异位词分组★★★

    49. 字母异位词分组 描述 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串...

  • 49. 字母异位词分组

    49. 字母异位词分组 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示...

  • 编程练习-字母异位词分组

    又很久没有做做题了,哎…… 题目-LeetCode字母异位词分组 给定一个字符串数组,将字母异位词组合在一起。字母...

  • 2020-07-12【leetcode-字符串】字谜分组

    【leetcode-字符串】字谜分组 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同...

  • 字谜分组

    字谜分组 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。说明:所有输入均为...

  • 字母异位词分组

    题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例: 输入: ["...

  • 字母异位词分组

    题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/grou...

  • 字母异位词分组

    给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例: 输入: ["eat...

网友评论

      本文标题:hash+排序(k个字符重排/字母异位词分组)

      本文链接:https://www.haomeiwen.com/subject/cmjimdtx.html