Problem: 2182. 构造限制重复的字符串
Code
C++
class Solution {
public:
static bool cmp(pair<char, int>& l, pair<char, int>& r)
{
// 如果value相等,比较key值
if (l.first == r.first)
return l.second > r.second;
else
// 否则比较value值
return l.first > r.first;
}
string repeatLimitedString(string s, int repeatLimit) {
// 感觉找一个合适的数据结构还挺重要
unordered_map<char, int> cnt;
for(auto x: s) {
cnt[x] ++;
}
vector<pair<char, int>> result(cnt.begin(), cnt.end());
sort(result.begin(), result.end(), cmp);
string res = "";
int l = result.size();
int i = 0;
while(i < l) {
int x = result[i].first, y = result[i].second;
if(y <= repeatLimit) {
res.append(y, x);
result[i ++ ].second = 0;
}
else {
// 特判:防止出现repeatLimit == 1,结尾是bbbb这种情况
int len = res.size();
if( len > 0 && res[len - 1] == x) break;
res.append(repeatLimit, x);
result[i].second -= repeatLimit;
if(i == l - 1) break;
int j = i + 1;
for(j; j < l; j ++) {
if(result[j].second > 0 ) {
res.append(1, result[j].first);
result[j].second --;
break;
}
}
}
}
return res;
}
};