899. Orderly Queue
A string S of lowercase letters is given. Then, we may make any number of moves.
In each move, we choose one of the first K letters (starting from the left), remove it, and place it at the end of the string.
Return the lexicographically smallest string we could have after any number of moves.
Example 1:
Input: S = "cba", K = 1
Output: "acb"
Explanation:
In the first move, we move the 1st character ("c") to the end, obtaining the string "bac".
In the second move, we move the 1st character ("b") to the end, obtaining the final result "acb".
Example 2:
Input: S = "baaca", K = 3
Output: "aaabc"
Explanation:
In the first move, we move the 1st character ("b") to the end, obtaining the string "aacab".
In the second move, we move the 3rd character ("c") to the end, obtaining the final result "aaabc".
Note:
1 <= K <= S.length <= 1000
S consists of lowercase letters only.
Approach
题目大意:给定一个字符串s和整数K,允许字符串的前K个字符中任意一个被移动到字符串末尾,然后返回最小字典序的字符串。
解题思路:当K==1时,只能旋转这个字符串,所以我们就旋转字符串,找到最小的;当K>1时,不仅可以旋转字符串,还可以交换任意两个相邻的字符而不改变其他字符的顺序,所以我们可以直接对字符串排序,找到最小。
Code
class Solution {
public:
string orderlyQueue(string S, int K) {
if (K > 1) {
sort(S.begin(), S.end());
return S;
}
string res = S;
for (int i = 0; i < S.size(); i++) {
res = min(res, S.substr(i) + S.substr(0, i));
}
return res;
}
};