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

56 阅读3分钟

问题描述

小U拥有一个由0和1组成的字符串,她可以进行最多k次操作,每次操作可以交换相邻的两个字符。目标是通过这些操作,使得最终得到的字符串字典序最小。

例如,小U当前有一个字符串 01010,她最多可以进行 2 次相邻字符交换操作。通过这些操作,她可以将字符串调整为 00101,这是可以通过不超过2次操作得到的字典序最小的字符串。

现在,小U想知道,经过最多k次操作后,能够得到的字典序最小的字符串是什么。

解题思路

题目分析

这个问题要求通过最多k次相邻字符交换操作,将一个由0和1组成的字符串调整为字典序最小的字符串。字典序最小的字符串意味着在所有可能的字符串排列中,该字符串应该在字典中排在最前面。

解答思路

  1. 贪心策略:在每次操作中,应该尽可能地将最左边的1与它右边最近的0交换,这样可以保证每次操作都能使字符串更接近字典序最小。
  2. 边界条件:需要检查k次操作是否足够进行交换,如果k次操作不足以将所有的1都移到0的右边,那么我们只能尽可能地进行交换。
  3. 实现细节:在实现时,需要注意字符串的遍历和交换操作,以及如何有效地判断交换是否成功。

代码详解

通过最多k次交换操作来调整字符串,使其达到字典序最小。以下是代码的详细解释:

  1. 字符数组初始化:首先,将输入的字符串s转换为字符数组ch,以便进行交换操作。
char[] ch = new char[n];
for (int i = 0; i < n; i++) {
    ch[i] = s.charAt(i);
}
  1. 交换操作:外层循环控制最多k次操作,内层循环遍历字符串,寻找可以交换的位置。如果找到1后面紧跟着0的情况,就进行交换,并跳出内层循环,继续寻找下一个可以交换的位置。
for (int j = 0; j < k; j++) {
    for (int i = 0; i < n - 1; i++) {
        int number = Integer.parseInt(ch[i] + "");
        if (number == 1 && ch[i + 1] - '0' == 0) {
            char temp = ch[i];
            ch[i] = ch[i + 1];
            ch[i + 1] = temp;
            break;
        }
    }
}
  1. 结果转换:将调整后的字符数组转换回字符串,并输出。
ans = String.valueOf(ch);
System.out.println(ans);
return ans;

完整代码

public class Main {
    public static String solution(int n, int k, String s) {
        // write code here
        String ans="";
        char[] ch=new char[n];
        for(int i=0;i<n;i++){
            ch[i]=s.charAt(i);
        }
        for(int j=0;j<k;j++){
            for(int i=0;i<n-1;i++){
                int number=Integer.parseInt(ch[i]+"");
                if(number==1&&ch[i+1]-'0'==0){
                    char temp=ch[i];
                    ch[i]=ch[i+1];
                    ch[i+1]=temp;
                    break;
                }
            }
        }
        ans=String.valueOf(ch);
        System.out.println(ans);
        return ans;
    }

    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"));
    }
}

个人思考与分析

算法效率

这个算法的时间复杂度是O(nk),其中n是字符串的长度,k是允许的操作次数。这是因为在最坏的情况下,我们需要遍历整个字符串n次,并且对于每次遍历,我们可能需要进行k次操作。

算法的局限性

这个算法假设了k次操作总是足够将字符串调整为字典序最小的形式。在k次操作不足以完成调整的情况下,算法只能尽可能地进行调整,而不能确保结果一定是最优的。