难度中等:767. 重构字符串
思路
将char出现的次数从到小进行排序,弹出最大的和次大的进行组合,再将剩下的放回去,接着执行,直到剩下零个或者一个,放到string最后边。
在进行这些操作前还需对是否可以有解进行判断,当某个字符大于一半时,是不可能全部和别人进行组合的,
刚开始我在纸上模拟的时候,想到了这种方法,但是奈何实现起来有些困难,就看了官方题解
官方题解的第一个思路和我是一样的,但是它实现出来了,使用的是大顶堆,自定义了cmp函数,
下面我将这种方法的代码发出来
代码
class Solution {
public:
string reorganizeString(string S) {
if(S.length()<2){
return "";
}
vector<int> counts(26,0);
int maxCount = 0;
int length = S.length();
for(int i=0;i<length;i++){
char c = S[i];
counts[c -'a'] ++;
maxCount = max(maxCount ,counts[c-'a']);
}
if(maxCount > (length +1) /2)
return "";
auto cmp = [&](const char& letter1, const char& letter2) {
return counts[letter1 - 'a'] < counts[letter2 - 'a'];
};
priority_queue<char, vector<char>, decltype(cmp)> queue{cmp};
for(char c ='a' ; c <='z';c++){
if (counts[c - 'a'] > 0) {
queue.push(c);
}
}
string sb = "";
while (queue.size() > 1) {
char letter1 = queue.top(); queue.pop();
char letter2 = queue.top(); queue.pop();
sb += letter1;
sb += letter2;
int index1 = letter1 - 'a', index2 = letter2 - 'a';
counts[index1]--;
counts[index2]--;
if (counts[index1] > 0) {
queue.push(letter1);
}
if (counts[index2] > 0) {
queue.push(letter2);
}
}
if (queue.size() > 0) {
sb += queue.top();
}
return sb;
}
};