1. 题目解析与需求拆解
1370题"上升下降字符串"是一道典型的字符串处理题目,题目要求我们按照特定规则重新排列字符串。具体规则如下:
- 从字符串中选出最小的字符,加到结果字符串中
- 再从剩余字符中选出次小的字符,加到结果字符串中
- 重复此过程直到没有字符剩余
- 然后从剩余字符中选出最大的字符,加到结果字符串中
- 接着选出次大的字符
- 重复此过程直到没有字符剩余
- 重复步骤1-6直到所有字符都被使用
这个规则可以简称为"先升序后降序"的交替选取策略。举个例子,对于输入字符串"aaaabbbbcccc",输出应该是"abccbaabccba"。
1.1 核心问题分析
这道题的核心在于理解并实现这个特殊的排序规则。我们需要关注几个关键点:
- 如何高效地获取当前最小/最大字符
- 如何处理字符的重复出现
- 如何实现升序和降序的交替选取
- 如何判断所有字符是否已被使用
提示:这类字符串重排问题通常需要考虑字符频率统计,这道题也不例外。使用哈希表记录字符出现次数是常见的解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计与实现思路
2.1 基础解法:桶排序思想
最直观的解法是使用桶排序的思想:
- 创建一个大小为26的数组(对应26个字母)来统计每个字符的出现次数
- 按照题目要求的顺序遍历这个数组:
- 先从左到右(升序)选取字符
- 再从右到左(降序)选取字符
- 每次选取一个字符后,减少其计数
- 重复这个过程直到所有字符计数为0
python复制def sortString(s: str) -> str:
count = [0] * 26
for ch in s:
count[ord(ch) - ord('a')] += 1
result = []
while len(result) < len(s):
# 升序选取
for i in range(26):
if count[i] > 0:
result.append(chr(i + ord('a')))
count[i] -= 1
# 降序选取
for i in range(25, -1, -1):
if count[i] > 0:
result.append(chr(i + ord('a')))
count[i] -= 1
return ''.join(result)
2.2 时间复杂度分析
这个算法的时间复杂度是O(n),其中n是字符串的长度。因为:
- 统计字符频率:O(n)
- 构建结果字符串:外层循环最多执行n/26次(每次至少处理26个字符),内层是固定26次循环,所以也是O(n)
空间复杂度是O(1),因为我们只使
