问题描述
小U拥有一个由0和1组成的字符串,她可以进行最多k次操作,每次操作可以交换相邻的两个字符。目标是通过这些操作,使得最终得到的字符串字典序最小。
例如,小U当前有一个字符串 01010,她最多可以进行 2 次相邻字符交换操作。通过这些操作,她可以将字符串调整为 00101,这是可以通过不超过2次操作得到的字典序最小的字符串。
现在,小U想知道,经过最多k次操作后,能够得到的字典序最小的字符串是什么。
测试样例
样例1:
输入:
n = 5, k = 2, s = "01010"
输出:'00101'
样例2:
输入:
n = 7, k = 3, s = "1101001"
输出:'0110101'
样例3:
输入:
n = 4, k = 1, s = "1001"
输出:'0101'
-
理解问题:我们需要通过最多
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; if (swapsNeeded <= k){ while (minIndex > i){ char temp = chars[minIndex]; chars[minIndex] = chars[minIndex - 1]; chars[minIndex - 1] = temp; minIndex--; } k -= swapsNeeded; } } 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"));
}
}
代码解释:
- 转换为字符数组:我们将字符串转换为字符数组,以便于进行交换操作。
- 遍历字符串:我们遍历字符串的每个位置,找到当前位置到末尾的最小字符。
- 计算交换次数:我们计算将最小字符移动到当前位置所需的交换次数。
- 进行交换:如果交换次数不超过
k,则进行交换,并更新k。 - 返回结果:最后将字符数组转换回字符串并返回。