1. 问题分析与解题思路
LeetCode 1370题"上升下降字符串"是一个有趣的字符串处理问题。题目要求我们按照特定规则重新排列字符串:首先按字符升序选取字符,然后按降序选取字符,如此交替进行,直到用完所有字符。
1.1 题目核心要求解析
题目给出的具体规则是:
- 从字符集中选出最小的字符,将其添加到结果字符串
- 再从剩余字符中选出次小的字符,添加到结果字符串
- 重复上述过程直到无法继续选择
- 然后从剩余字符中选出最大的字符,添加到结果字符串
- 接着从剩余字符中选出次大的字符,添加到结果字符串
- 重复上述过程直到无法继续选择
- 重复1-6步骤直到用完所有字符
这个问题的关键在于如何高效地跟踪每个字符的剩余数量,并在升序和降序选择之间切换。
1.2 解题思路分析
针对这个问题,我考虑了两种主要实现方案:
-
哈希表+动态删除方案:
- 使用哈希表统计每个字符的出现频率
- 将字符按顺序存储在数组中
- 交替进行升序和降序遍历
- 当字符计数减至0时从数组中删除该字符
-
哈希表+状态标记方案:
- 同样使用哈希表统计频率
- 使用状态数组标记哪些字符已经用完
- 通过状态标记避免实际删除操作
- 在遍历时跳过已用完的字符
两种方案各有优劣,第一种方案在字符用完时立即删除,减少了后续遍历的元素数量;第二种方案则避免了频繁的数组删除操作,通过状态标记实现类似效果。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 方案1:哈希表+动态删除实现详解
2.1 代码结构与核心逻辑
cpp复制class Solution {
public:
string sortString(string s) {
map<char, int> mp;
for(char& c : s) mp[c]++;
vector<pair<char, int>> arr;
for(auto&& [k, l] : mp) arr.push_back({k, l});
string ret;
while(arr.size() > 0) {
// 升序遍历
