字典序最小的01字符串|豆包MarsCodeAI刷题

34 阅读2分钟

要解答这个问题,我们需要实现一个算法,使得在最多k次相邻字符交换操作后,字符串的字典序最小。我们可以采用贪心算法来解决这个问题。

解题思路

  1. 理解问题

    • 我们有一个由'0'和'1'组成的字符串。
    • 我们可以进行最多k次相邻字符交换操作。
    • 目标是使字符串的字典序最小。
  2. 贪心策略

    • 从字符串的第一个字符开始,尝试将'0'尽可能地移到前面。
    • 每次找到一个'0',计算将其移到当前位置所需的交换次数。
    • 如果交换次数不超过k,则进行交换;否则,继续检查下一个字符。
  3. 算法步骤

    • 遍历字符串,记录当前已经处理的字符数(即当前位置)。
    • 对于每个字符,如果是'0',计算将其移到当前位置所需的交换次数。
    • 如果交换次数不超过k,则进行交换,并更新k的值。
    • 继续遍历直到字符串结束或k用完。
public class Main {
    public static String solution(int n, int k, String s) {
        // 将字符串转换为字符数组,方便进行交换操作
        char[] chars = s.toCharArray();
        
        // 遍历字符数组
        for (int i = 0; i < n; i++) {
            // 找到当前位置之后的最小字符及其位置
            int minIndex = i;
            for (int j = i + 1; j < n; j++) {
                if (chars[j] < chars[minIndex]) {
                    minIndex = j;
                }
            }
            
            // 计算从当前位置到最小字符位置需要的交换次数
            int swapsNeeded = minIndex - i;
            
            // 如果交换次数小于等于k,则进行交换
            if (swapsNeeded <= k) {
                // 将最小字符交换到当前位置
                while (minIndex > i) {
                    // 交换相邻字符
                    char temp = chars[minIndex];
                    chars[minIndex] = chars[minIndex - 1];
                    chars[minIndex - 1] = temp;
                    minIndex--;
                    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"));
    }
}
### 关键步骤

1.  **将字符串转换为字符数组**:

    -   这样可以方便地进行字符交换操作。

1.  **遍历字符串**:

    -   对于每个字符,如果是'0',计算将其移到当前位置所需的交换次数。

1.  **进行交换操作**:

    -   如果交换次数不超过k,则进行交换,并更新k的值。

1.  **返回最终的字符串**:

    -   将字符数组转换回字符串并返回。

通过这种贪心策略,我们可以确保在最多k次操作内得到字典序最小的字符串。