力扣767.重构字符串
-
将每个字母的出现次数存在哈希表中
- 按出现次数排序
- 如果最大的次数 > 其他次数之和 + 1,说明最终一定不会有合法答案
- 从最大次数开始 先放偶数下标 再放奇数下标
cpp
class Solution {
public:
string reorganizeString(string s) {
int n = s.size();
unordered_map<char,int> cnt;
for(char c:s)
cnt[c] ++;
vector<pair<char,int>> a(cnt.begin(),cnt.end());
//语法 自定义按次数排序
ranges::sort(a,[](const auto&p,const auto&q)
{
return p.second > q.second;
});
int m = a[0].second;
if(m > n - m + 1)
return "";
string res(n,0);
int i = 0;
for(auto [ch,cur] : a)
{
while(cur -- )
{
res[i] = ch;
i += 2;
if(i >= n)
i = 1;
}
}
return res;
}
};