AI刷题19. 字典序最小的01字符串 | 豆包MarsCode AI刷题

3 阅读4分钟

一. 问题描述

小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 算法步骤

  1. 遍历字符串:从字符串的第一个字符开始,逐步向后遍历。
  2. 寻找最小字符:在当前位置 i 到 i + k 的范围内寻找最小的字符,并记录其位置 minIndex
  3. 交换字符:如果最小字符不在当前位置 i,则从 minIndex 向 i 方向逐个交换字符,直到最小字符到达 i 位置。每交换一次,操作次数 k 减一。
  4. 重复步骤:继续遍历字符串,直到遍历完所有字符或操作次数 k 用完。
  5. 返回结果:将字符数组转换回字符串并返回。

3.2 具体步骤

  1. 初始化:将输入字符串转换为字符数组。
  2. 外层循环:遍历字符数组,直到遍历完所有字符或操作次数 k 用完。
  3. 内层循环:在当前位置 i 到 i + k 的范围内寻找最小的字符,并记录其位置 minIndex
  4. 交换操作:如果最小字符不在当前位置 i,则从 minIndex 向 i 方向逐个交换字符,直到最小字符到达 i 位置。每交换一次,操作次数 k 减一。
  5. 返回结果:将字符数组转换回字符串并返回。

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 优势

  1. 快速获取思路:AI可以迅速提供解题思路和算法步骤,帮助用户快速理解问题的核心和解决方法。
  2. 代码生成:AI可以根据用户的需求生成完整的代码实现,节省了用户编写代码的时间。
  3. 错误检查:AI可以帮助用户检查代码中的错误,并提供修改建议,提高代码的正确性和效率。
  4. 学习辅助:AI可以作为学习辅助工具,帮助用户理解复杂的算法和数据结构,提升编程能力。

5.1.2 局限性

  1. 依赖性:过度依赖AI可能导致用户在编程技能上的退步,无法独立解决复杂问题。
  2. 理解深度:AI虽然可以提供详细的解题思路,但用户可能无法完全理解背后的逻辑和原理,影响学习效果。