题目
将26个字母出现的次数放优先队列,每次取出两个出现次数最大的字母,将队列里他们的次数–。
class Solution {
#define pi pair<int,char>
public:
int vis[26];
string reorganizeString(string s) {
int n=s.size();
for(char c:s) ++vis[c-'a'];
priority_queue<pi>q;
for(int i=0;i<26;++i){
if(!vis[i]) continue;
if(vis[i]>(n+1)/2) return "";
q.push({vis[i],i+'a'});
}
string ans="";
while(q.size()>=2){
pi x=q.top();q.pop();
pi y=q.top();q.pop();
ans+=x.second,ans+=y.second;
if(--x.first) q.push(x);
if(--y.first) q.push(y);
}
if(!q.empty()) {ans+=q.top().second;q.pop();}
return ans;
}
};