题目地址:
https://www.acwing.com/file_system/file/content/whole/index/content/10768279/
给定一个长度为 n n n的由小写字母构成的字符串。请你按照 a ∼ z a∼z a∼z的顺序,对字符串内的字符进行重新排序,并输出重新排序后的字符串。
输入格式:
第一行包含整数
T
T
T,表示共有
T
T
T组测试数据。
每组数据第一行包含整数
n
n
n。
第二行包含一个长度为
n
n
n的由小写字母构成的字符串。
输出格式:
每组数据输出占一行,输出重新排序后的字符串。
数据范围:
前
3
3
3个测试点满足
1
≤
T
≤
5
1≤T≤5
1≤T≤5,
1
≤
n
≤
10
1≤n≤10
1≤n≤10。
所有测试点满足
1
≤
T
≤
100
1≤T≤100
1≤T≤100,
1
≤
n
≤
200
1≤n≤200
1≤n≤200。
小写字母一共只有 26 26 26个,所以可以用计数排序。代码如下:
#include <cstring>
#include <iostream>
using namespace std;
char s[210];
int n;
int cnt[26];
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
scanf("%s", s + 1);
memset(cnt, 0, sizeof cnt);
for (int i = 1; i <= n; i++) cnt[s[i] - 'a']++;
for (int i = 1, j = 0; i <= n; i++) {
while (j < 26 && !cnt[j]) j++;
s[i] = 'a' + j;
cnt[j]--;
}
printf("%s\n", s + 1);
}
}
每组数据时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。