首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >LeetCode 2182. 构造限制重复的字符串(贪心、map)

LeetCode 2182. 构造限制重复的字符串(贪心、map)

作者头像
Michael阿明
发布2022-03-10 18:30:44
发布2022-03-10 18:30:44
3670
举报

文章目录

1. 题目

给你一个字符串 s 和一个整数 repeatLimit ,用 s 中的字符构造一个新字符串 repeatLimitedString ,使任何字母 连续 出现的次数都不超过 repeatLimit 次。你不必使用 s 中的全部字符。

返回 字典序最大的 repeatLimitedString 。

如果在字符串 a 和 b 不同的第一个位置,字符串 a 中的字母在字母表中出现时间比字符串 b 对应的字母晚,则认为字符串 a 比字符串 b 字典序更大 。如果字符串中前 min(a.length, b.length) 个字符都相同,那么较长的字符串字典序更大。

代码语言:javascript
复制
示例 1:
输入:s = "cczazcc", repeatLimit = 3
输出:"zzcccac"
解释:使用 s 中的所有字符来构造 repeatLimitedString "zzcccac"。
字母 'a' 连续出现至多 1 次。
字母 'c' 连续出现至多 3 次。
字母 'z' 连续出现至多 2 次。
因此,没有字母连续出现超过 repeatLimit 次,字符串是一个有效的 repeatLimitedString 。
该字符串是字典序最大的 repeatLimitedString ,所以返回 "zzcccac" 。
注意,尽管 "zzcccca" 字典序更大,但字母 'c' 连续出现超过 3 次,所以它不是一个有效的 repeatLimitedString 。

示例 2:
输入:s = "aababab", repeatLimit = 2
输出:"bbabaa"
解释:
使用 s 中的一些字符来构造 repeatLimitedString "bbabaa"。 
字母 'a' 连续出现至多 2 次。 
字母 'b' 连续出现至多 2 次。 
因此,没有字母连续出现超过 repeatLimit 次,字符串是一个有效的 repeatLimitedString 。 
该字符串是字典序最大的 repeatLimitedString ,所以返回 "bbabaa" 。 
注意,尽管 "bbabaaa" 字典序更大,但字母 'a' 连续出现超过 2 次,所以它不是一个有效的 repeatLimitedString 。
 
提示:
1 <= repeatLimit <= s.length <= 10^5
s 由小写英文字母组成

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/construct-string-with-repeat-limit 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • map 对字符计数,map是有序的,为了获得字典序最大,逆序开始取
  • 每次判断字符串的末尾跟map最末尾的元素是否一样,不一样就取最多 repeatLimit 次,一样的话,就取 倒数第二个 元素 1 次
代码语言:javascript
复制
class Solution {
public:
    string repeatLimitedString(string s, int repeatLimit) {
        map<char,int> m;
        for(auto c : s)
            ++m[c];
        string ans;
        while(!m.empty())
        {
            int ct = repeatLimit;
            auto it = m.end();
            it--; // 最后一个元素
            if(it->first == ans.back())
            { // ans最后的字符 跟 最大的字符 一样                
                if(it == m.begin())
                    break; // 没有第二大的字符了,结束
                else
                {
                    it--;// 有第二大的,取一个出来就行了
                    ans.push_back(it->first);
                    if(--(it->second)==0)
                        m.erase(it);
                }
            }
            else
            { // ans最后的字符 跟 最大的字符 不一样   
                while(ct && !m.empty())
                {
                    ans.push_back(it->first);
                    if(--(it->second)==0)
                    {
                        m.erase(it);
                        break;
                    }
                    ct--;
                }
            }
        }
        return ans;
    }
};

104 ms 24 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档