top1编程
← 返回题目
题解

最大字符串

1 条题解

  • 0
    @ 2026-8-5 23:52:33

    P4684 最大字符串(入门)

    解题思路

    第一步,理解规则。 题目问:把一个字符串的字符重新排列,怎样排得到的字符串最大?提示说"ASCII 码值大的字符越靠左,字符串越大"。所以只要把所有字符按 ASCII 码从大到小排好,再连起来,就是答案。

    第二步,求长度。 把字符串读进字符数组 str,用 while 循环数出它的长度 len:遇到字符串结尾的空字符 '\0' 就停。

    第三步,排序。 sort(str, str + len) 也能对字符数组排序,因为它是按 char 类型的数值(也就是 ASCII 码)来比较大小的。排序后字符是从小到大排列的。

    第四步,倒序输出。 从最后一个字符 str[len-1] 倒着输出到第一个字符 str[0],就实现了从大到小排列。注意下标从 len-1 走到 0,不要多输出字符串结尾的空字符。

    用例子验证。 字符串 "alex" 里四个字符的 ASCII 码分别是 a(97)、l(108)、e(101)、x(120),从大到小排列是 x(120)、l(108)、e(101)、a(97),连起来得到 "xlea",和样例输出一致。再比如 "abc" 排序后倒序输出 "cba",正好是最大的排列。

    想一想生活里的例子。 把字符看成一群小朋友,谁的"ASCII 码值"大,谁就站到队伍最前面。

    边界情况: 字符串长度不超过 50,数组开 str[55] 足够;输入不含空格,用 cin 直接读入即可。

    参考代码

    // P4684 最大字符串:把字符串中的字符按ASCII码从大到小排列,得到能组成的最大字符串
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main() {
        char str[55];
        cin >> str;
        int len = 0;
        while (str[len]) len++; // 求字符串长度
        sort(str, str + len); // 按ASCII码从小到大排序
        for (int i = len - 1; i >= 0; i--) { // 倒序输出,就是从大到小
            cout << str[i];
        }
        cout << endl;
        return 0;
    }
    

    复杂度分析

    对 len 个字符排序,时间复杂度 O(len log len)。len 最大只有 50,排序开销可以忽略。求长度和倒序输出都是 O(len) 的循环。空间复杂度 O(len)。

    • 1