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

40 阅读2分钟

问题理解

需要通过最多 k 次相邻字符交换操作,使得给定的由 01 组成的字符串 s 的字典序最小。字典序最小意味着字符串中的 0 应该尽可能地排在前面,1 尽可能地排在后面。

数据结构选择

由于我们只需要处理字符串中的字符,并且需要频繁地进行字符交换操作,使用 StringBuffer 是一个不错的选择,因为它支持高效的插入和删除操作。

算法步骤

  1. 初始化:将字符串 s 转换为 StringBuffer,以便进行字符交换操作。
  2. 遍历字符串:从左到右遍历字符串,尝试将当前位置的字符与后面的字符进行交换,以使得字符串的字典序最小。
  3. 交换操作:在遍历过程中,如果发现当前字符比后面的字符大,则进行交换操作,并减少 k 的值。
  4. 边界条件:确保在 k 次操作内完成交换,并且字符串的字典序最小。

伪代码框架

public class Main {
    public static String solution(int n, int k, String s) {
        StringBuffer buffer = new StringBuffer(s);
        
        // 遍历字符串
        for (int i = 0; i < buffer.length() && k > 0; i++) {
            // 找到当前位置之后的最小字符及其位置
            int minIndex = i;
            for (int j = i + 1; j < buffer.length(); j++) {
                if (buffer.charAt(j) < buffer.charAt(minIndex)) {
                    minIndex = j;
                }
            }
            
            // 如果最小字符不在当前位置,进行交换
            while (minIndex > i && k > 0) {
                // 交换相邻字符
                char temp = buffer.charAt(minIndex);
                buffer.setCharAt(minIndex, buffer.charAt(minIndex - 1));
                buffer.setCharAt(minIndex - 1, temp);
                minIndex--;
                k--;
            }
        }
        
        return buffer.toString();
    }

    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. 遍历字符串:从左到右遍历字符串,尝试找到当前位置之后的最小字符。
  2. 交换操作:如果最小字符不在当前位置,通过交换相邻字符的方式将其移动到当前位置,并减少 k 的值。
  3. 边界条件:确保在 k 次操作内完成交换,并且字符串的字典序最小。