Make the String Lexicographically Larger in Java

2025 年 5 月 8 日 | 阅读 3 分钟

给定一个长度为 N 的字符串 'str'。任务是找到最大的字典序字符串,其中我们只能将 'str' 中的一个字符移动到任何其他索引一次。

示例 1

输入

字符串 str = "cad"

int N = 3

输出

最大的字典序字符串是 dca

解释

字符串的长度是 3,N 的值意味着需要考虑完整的 字符串 "cad"。

将字符串按降序排序后,"dca" 是确定最大字典序的结果。字符被重新排列,使得最大的 "d" 排在最前面,然后是 "c",最后是 "a"。

示例 2

输入

字符串 str = "abcd"

N = 4

输出

最大的字典序字符串是 dcba

解释

字符串的长度是 4,因为 N 大于 4,所以需要使用完整的字符串 "abcd"。

当字符串的字符按降序排列时,"dcba" 是结果。通过重新排列字符串,使得 "d" 成为最大的字符,然后是 "c"、"b",最后是 "a"。

示例 3

输入

字符串 str = "abcd"

int N = 3

输出

最大的字典序字符串是 cba

解释

在这种情况下,N 是 3,这意味着只考虑前三个字符 "abc"。

对于前三个字符,当 "abc" 按降序排序时,"cba" 是最大的字典序。最后一个字母 "d" 不包含在排序过程中。

示例 4

输入

字符串 str = "abc"

int N = 2

输出

最大的字典序字符串是 ba

解释

因为 N 等于 2,所以只考虑前两个字符 "ab"。

当这两个 "ab" 字母按降序排列时,会生成 "ba"。由于需要重新排列的字符是前两个,因此第三个字符 "c" 不包含在内。

朴素方法

该代码通过使用 substring 方法获取输入字符串的前 N 个字符,确保子字符串的长度与给定值匹配。子字符串已被转换为字符数组,使用 toCharArray,然后使用 Arrays.sort 对数组进行排序。StringBuilder 用于反转排序后的数组,以便字符按降序排列。为了确保可靠地处理边缘情况,程序会包含一个条件检查,以验证 N 是否超过字符串长度。

算法

步骤 1: 初始化字符串 str,以及长度 N。

步骤 2: 验证 N 是否大于字符串 str 的长度。

步骤 3: 如果是,则以错误消息结束该过程。

步骤 4: 对 str 应用 substring 方法以提取前 N 个字符。

步骤 5: 将获得的子字符串转换为字符 数组

步骤 6: 使用 Arrays.sort 函数 将字符数组按升序排序。

步骤 7: 将排序后的数组转换为字符串以获得降序;使用 StringBuilder 反转字符串。

步骤 8: 将前 N 个字母的最大字典序排列作为反转后的字符串打印出来。

实施

输出

 
The Largest Lexicographic string is cba   

复杂度分析

上述代码的时间复杂度为 O(N),其中 N 是给定字符串的长度,空间复杂度为 O(1)。