思路:
- 把每个字符和它的个数存成一个结构体 ALPHA,优先队列每次取出最多的两个字符打印。注意最后是否成功的判定条件。
代码:
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
string str , ans;
struct ALPHA{
char c;
int cnt;
ALPHA(char _c , int _cnt) : c(_c) , cnt(_cnt) {} ;
friend bool operator < (const ALPHA &a , const ALPHA &b)
{
return a.cnt < b.cnt ;
}
};
priority_queue <ALPHA , vector<ALPHA> , less<ALPHA> > Q;
int num[30];
int main(){
cin>>str;
memset(num , 0 , sizeof(num));
for(int i=0 ; i<str.size() ; i++)
num[str[i] - 'a']++;
for(int i=0;i<26;i++)
Q.push(ALPHA(char('a' + i) , num[i]));
while(Q.size()){
ALPHA L = Q.top() ; Q.pop() ;
if(!L.cnt) break;
ans += L.c ; L.cnt-- ;
ALPHA R = Q.top() ; Q.pop() ;
Q.push(L) ;
if(!R.cnt) break;
ans += R.c ; R.cnt-- ;
Q.push(R) ;
}
ALPHA cur = Q.top() ; Q.pop() ;
bool ok = true;
if(cur.cnt > 1)
ok = false;
for(int i=1 ; i < ans.size() ; i++){
if(ans[i] == ans[i-1]){
ok = false;
break;
}
}
if(ok)
cout<<ans<<endl;
else
cout<<"NO"<<endl;
return 0;
}