【每日一题】构造限制重复的字符串

发布时间:2024年01月13日

Tag

【贪心】【字符串】【2024-01-13】


题目来源

2182. 构造限制重复的字符串


解题思路

方法一:贪心

思路

解题思想比较简单,利用贪心思想,每次选择当前剩余字符串中字典序最大的字符加到答案字符串末尾,如果答案字符串末尾的字符已经连续出现了 repeatLimit 次,则将字典序次大的字符加到答案字符串,随后继续选择当前剩余字符串的字典序最大的字符加到字符串末尾,直至使用完字符或没有新的字符可以合法加入。

想法比较简单,但实现起来稍微有点难度,具体实现见下方算法部分。

算法

const int N = 26;
class Solution {
public:
    string repeatLimitedString(string s, int repeatLimit) {
        vector<int> count(N);
        // 统计每个字符出现次数
        for (char c : s) {
            count[c - 'a']++;
        }
        string ret;
        int m = 0;
        for (int i = N - 1, j = N - 2; i >= 0 && j >= 0;) {
            // 当前字符已经填完,填入后面的字符,重置 m
            if (count[i] == 0) { 
                m = 0;
                i--;  
            } 
            // 当前字符未超过限制
            else if (m < repeatLimit) { 
                count[i]--;
                ret.push_back('a' + i);
                m++;
            } 
            // 当前字符已经超过限制,查找可填入的其他字符
            else if (j >= i || count[j] == 0) { 
                j--;
            } 
            // 当前字符已经超过限制,填入其他字符,并且重置 m
            else { 
                count[j]--;
                ret.push_back('a' + j);
                m = 0;
            }
        }
        return ret;
    }
};

复杂度分析

时间复杂度: O ( n + ∑ ) O(n+ \sum) O(n+) n n n 为字符串 s 的长度, ∑ = 26 \sum = 26 =26 为小写字符集的长度。

空间复杂度: O ( ∑ ) O(\sum) O()

写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

文章来源:https://blog.csdn.net/weixin_54383080/article/details/135566763
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。