题目
https://leetcode.cn/problems/construct-string-with-repeat-limit/description/
解答
1 | class Solution { |
测试主函数
1 | int main() { |
解释
1. 初始化和字符计数
1 | vector<int> count(N); |
在这一部分中,首先定义了一个大小为 N(26)的 count 向量,用于统计字符串 s 中每个小写字母的出现次数。通过 c - 'a' 计算字符 c 在字母表中的索引,并在 count 向量中相应位置递增计数。
2. 构建结果字符串
1 | string ret; |
这部分代码初始化了结果字符串 ret 和一个变量 m(用于追踪当前字符的连续出现次数)。接着,使用两个循环变量 i 和 j 进行遍历。i 从 N - 1(即字母 ‘z’)开始向下迭代,寻找可用的最大字母。j 从 N - 2(即字母 ‘y’)开始,用于在当前字母达到重复限制时找到下一个可用字母。
3. 字符填充逻辑
1 | if (count[i] == 0) { |
这是函数的核心逻辑:
- 当前字符用完:如果
count[i]为 0(即当前字母用完了),重置m并让i指向下一个字母。 - 当前字符未达重复限制:如果
m < repeatLimit,添加当前字母到ret,更新count[i]和m。 - 寻找备选字符:如果当前字符达到重复限制,检查
j是否有可用字符。如果没有,将j向前移动。 - 使用备选字符:如果有可用的备选字符,将其添加到
ret中,更新count[j]并重置m。
4. 返回结果
1 | return ret; |
循环结束后,返回构建的字符串 ret,它是按照题目要求,尽可能使用字母表中较大的字符构建的,且每个字符的连续出现次数不超过 repeatLimit。
总结
这个函数的目标是重新构建字符串,使得任何字符在新字符串中连续出现的次数不超过 repeatLimit,同时尽可能保持字符在字母表中的降序。它通过维护每个字符的出现次数以及重复限制来实现这一目标,并在必要时使用备选字符填充。