LeetCode 899. Orderly Queue

899.Orderly Queue(有序队列)

链接

https://leetcode-cn.com/problems/orderly-queue/

题目

给出了一个由小写字母组成的字符串 S。然后,我们可以进行任意次数的 移动

在每次移动中,我们选择前 K 个字母中的一个(从左侧开始),将其从原位置移除,并放置在字符串的末尾。

返回我们在任意次数的移动之后可以拥有的按字典顺序排列的最小字符串。

示例 1:

  输入:S = "cba", K = 1
  输出:"acb"
  解释:
  在第一步中,我们将第一个字符("c")移动到最后,获得字符串 "bac"。
  在第二步中,我们将第一个字符("b")移动到最后,获得最终结果 "acb"。

示例 2:

  输入:S = "baaca", K = 3
  输出:"aaabc"
  解释:
  在第一步中,我们将第一个字符("b")移动到最后,获得字符串 "aacab"。
  在第二步中,我们将第三个字符("c")移动到最后,获得最终结果 "aaabc"。

提示:

  1. 1 <= K <= S.length <= 1000`
  2. S 只由小写字母组成。

思路

这题的设定其实有点迷,当K==1时,就代表前后次序(相对位置)并没有改变,只是在开头的可以移到后端。当K!=1时,就代表可以随意组合,直接计算字典最小的序列即可。

直接分类讨论,=1时,新建S=S+S,从前往后取len位比较即可;!=1时,拆为数组,排序,组合即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static String orderlyQueue(String S, int K) {
int len = S.length();

if (K == 1) {
String word = S;
S = S + S;
for (int i = 0; i < len; i++) {
if (word.compareTo(S.substring(i, i + len)) > 0) {
word = S.substring(i, i + len);
}
}
return word;
} else {
char[] word = S.toCharArray();
Arrays.sort(word);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < S.length(); i++) {
sb.append(word[i]);
}
return sb.toString();
}
}
---本文结束,感谢阅读---