题解 | #重排字符串#
重排字符串
https://www.nowcoder.com/practice/6c3a5604cf274b2287fbe27c5dc74743
class Solution {
public:
string rearrangestring(string str) {
// write code here
// Step 1:统计所有出现字符的出现次数
unordered_map<char, int> char_count;
for (char c : str) {
char_count[c]++;
}
// Step 2:大堆顶的优先级队列比较的 lambda表达式
auto compare = [](pair<int, char>& a, pair<int, char>& b) {
return a.first < b.first;
};
//priority_queue 是一个模板类,用于实现优先队列,其中的元素按照一定的优先级顺序进行排列,
//默认情况下是大顶堆(即最大元素优先)。
//模板参数中:
//pair<int, char> 表示队列中存储的元素类型,这里是频次(int)和字符(char)的组合。
//vector<pair<int, char>> 表示用于存储元素的底层容器类型,这里选择了 vector.
//decltype(compare) 表示比较函数的类型,由于 compare 是一个 lambda 表达式,
//我们使用 decltype 来推导出其类型。
priority_queue<pair<int, char>, vector<pair<int, char>>, decltype(compare)>
max_heap(compare);
//将数据的压入堆中
for (auto& entry : char_count) {
max_heap.push({entry.second, entry.first});
}
// Step 3: 重建字符串
string result;
//临时对象,表示前一个
pair<int, char> prev = {-1, '#'};
while (!max_heap.empty()) {
//当前位置
pair<int, char> current = max_heap.top();
max_heap.pop();
// 如果前一个对象剩余个数>0,将前一个对象压入堆中
if (prev.first > 0) {
max_heap.push(prev);
}
// 将当前对像的值写入result中
result += current.second;
//当前对象出现次数减1
current.first--;
//将当前对象赋值给前一个对象
prev = current;
}
//检查结果字符串长度是否相等,如果不相等,则表示无法返回
if (result.length() != str.length()) {
return "";
}
return result;
}
};
