有序队列
难度:
标签:
题目描述
代码结果
运行时间: 26 ms, 内存: 16.9 MB
/*
* 思路:
* 1. 当 k == 1 时,我们只能将字符串的第一个字符移动到末尾,这样等价于旋转字符串。
* 因此,我们可以尝试所有的旋转,找到字典序最小的那个。
* 2. 当 k > 1 时,我们可以对字符串进行任意排序。
* 因此,我们只需对字符串进行排序即可。
*/
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public String orderlyQueue(String s, int k) {
if (k == 1) {
return IntStream.range(0, s.length())
.mapToObj(i -> s.substring(i) + s.substring(0, i))
.min(String::compareTo)
.orElse(s);
} else {
return s.chars()
.sorted()
.mapToObj(c -> String.valueOf((char) c))
.collect(Collectors.joining());
}
}
}
解释
方法:
这个题解的思路是分两种情况讨论:
1. 当k=1时,我们只能选择队列的第一个字符,然后将其移到队列的末尾。这等价于对字符串进行旋转操作。我们将字符串s所有可能的旋转形式存储在数组a中,然后对数组a进行排序,取排序后的第一个字符串即为最优解。
2. 当k>1时,因为我们可以选择前k个字符中的任意一个,相当于可以对前k个字符进行任意排列。所以无论我们进行多少次操作,最终得到的字符串在字典序上一定不会小于将原字符串按字典序排列得到的字符串。所以我们直接对原字符串的字符进行排序即可得到最优解。
时间复杂度:
O(n^2)
空间复杂度:
O(n^2)
代码细节讲解
🦆
为什么在k=1的情况下,所有可能的旋转字符串排序后的第一个元素就是字典序最小的结果?
▷🦆
在k>1的情况下,直接对字符串进行排序得到的结果为什么一定是最优解?是否有可能通过特定的字符移动得到更小的字典序?
▷🦆
在k=1时,能否使用更高效的方法找到字典序最小的字符串,而不是生成所有旋转后的字符串并排序?
▷