一. 问题描述
小U拥有一个由0和1组成的字符串,她可以进行最多k次操作,每次操作可以交换相邻的两个字符。目标是通过这些操作,使得最终得到的字符串字典序最小。
例如,小U当前有一个字符串 01010
,她最多可以进行 2 次相邻字符交换操作。通过这些操作,她可以将字符串调整为 00101
,这是可以通过不超过2次操作得到的字典序最小的字符串。
现在,小U想知道,经过最多k次操作后,能够得到的字典序最小的字符串是什么。
测试样例
样例1:
输入:
n = 5, k = 2, s = "01010"
输出:'00101'
题目链接:www.marscode.cn/practice/36…
二. 思路解析
2.1 问题理解
我们需要通过最多 k
次相邻字符交换操作,将一个由 0
和 1
组成的字符串调整为字典序最小的字符串。字典序最小意味着字符串中的字符按照从小到大的顺序排列。
2.2 数据结构选择
由于我们需要频繁地进行字符交换操作,使用字符数组(char[]
)来存储字符串是一个合适的选择,因为数组的元素可以直接通过索引进行访问和修改。
三. 解题步骤
3.1 算法步骤
- 遍历字符串:从字符串的第一个字符开始,逐步向后遍历。
- 寻找最小字符:在当前位置
i
到i + k
的范围内寻找最小的字符,并记录其位置minIndex
。 - 交换字符:如果最小字符不在当前位置
i
,则从minIndex
向i
方向逐个交换字符,直到最小字符到达i
位置。每交换一次,操作次数k
减一。 - 重复步骤:继续遍历字符串,直到遍历完所有字符或操作次数
k
用完。 - 返回结果:将字符数组转换回字符串并返回。
3.2 具体步骤
- 初始化:将输入字符串转换为字符数组。
- 外层循环:遍历字符数组,直到遍历完所有字符或操作次数
k
用完。 - 内层循环:在当前位置
i
到i + k
的范围内寻找最小的字符,并记录其位置minIndex
。 - 交换操作:如果最小字符不在当前位置
i
,则从minIndex
向i
方向逐个交换字符,直到最小字符到达i
位置。每交换一次,操作次数k
减一。 - 返回结果:将字符数组转换回字符串并返回。
3.3 复杂度分析
- 时间复杂度:在最坏情况下,每次都需要遍历
k
个字符来找到最小字符,因此时间复杂度为O(n * k)
,其中n
是字符串的长度。 - 空间复杂度:由于我们只使用了常数级别的额外空间(字符数组),空间复杂度为
O(1)
。
通过以上步骤,我们可以有效地解决这个问题,并得到字典序最小的字符串。
四. Code
public class Main {
public static String solution(int n, int k, String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < n && k > 0; i++) {
// 找到当前位置到末尾的最小字符及其位置
int minIndex = i;
for (int j = i + 1; j < n && j <= i + k; j++) {
if (chars[j] < chars[minIndex]) {
minIndex = j;
}
}
// 如果最小字符不在当前位置,进行交换
if (minIndex != i) {
for (int j = minIndex; j > i; j--) {
// 交换相邻字符
char temp = chars[j];
chars[j] = chars[j - 1];
chars[j - 1] = temp;
k--; // 减少一次操作次数
}
}
}
return new String(chars);
}
public static void main(String[] args) {
System.out.println(solution(5, 2, "01010").equals("00101"));
System.out.println(solution(7, 3, "1101001").equals("0110101"));
System.out.println(solution(4, 1, "1001").equals("0101"));
}
}
五. 总结
本人最开始写这道题时其实是没有思路的,不知道怎么去写,不过还好有AI,给我一些思路,我思考一下,并让AI给出具体步骤,最终我才能解出来,心里非常高兴,终于又写出一道算法题。
5.1 用AI解题的感受
5.1.1 优势
- 快速获取思路:AI可以迅速提供解题思路和算法步骤,帮助用户快速理解问题的核心和解决方法。
- 代码生成:AI可以根据用户的需求生成完整的代码实现,节省了用户编写代码的时间。
- 错误检查:AI可以帮助用户检查代码中的错误,并提供修改建议,提高代码的正确性和效率。
- 学习辅助:AI可以作为学习辅助工具,帮助用户理解复杂的算法和数据结构,提升编程能力。
5.1.2 局限性
- 依赖性:过度依赖AI可能导致用户在编程技能上的退步,无法独立解决复杂问题。
- 理解深度:AI虽然可以提供详细的解题思路,但用户可能无法完全理解背后的逻辑和原理,影响学习效果。