给定一个字符串 s
和一个整数 k
。你可以从 s
的前 k
个字母中选择一个,并把它加到字符串的末尾。
返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串 。
示例 1:
输入:s = "cba", k = 1 输出:"acb" 解释: 在第一步中,我们将第一个字符(“c”)移动到最后,获得字符串 “bac”。 在第二步中,我们将第一个字符(“b”)移动到最后,获得最终结果 “acb”。
示例 2:
输入:s = "baaca", k = 3 输出:"aaabc" 解释: 在第一步中,我们将第一个字符(“b”)移动到最后,获得字符串 “aacab”。 在第二步中,我们将第三个字符(“c”)移动到最后,获得最终结果 “aaabc”。
提示:
1 <= k <= S.length <= 1000
s
只由小写字母组成。
前言
对于任何字符串,如果可以交换任意相邻字符,则可以对字符串中的字符做类似冒泡排序的操作,最终得到一个升序排列的字符串。
方法一:分类判断
若
若
因此,只要
class Solution:
def orderlyQueue(self, s: str, k: int) -> str:
if k == 1:
ans = s
for _ in range(len(s) - 1):
s = s[1:] + s[0]
ans = min(ans, s)
return ans
return "".join(sorted(s))
class Solution {
public String orderlyQueue(String s, int k) {
if (k == 1) {
String ans = s;
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < s.length() - 1; ++i) {
sb.append(sb.charAt(0)).deleteCharAt(0);
if (sb.toString().compareTo(ans) < 0) {
ans = sb.toString();
}
}
return ans;
}
char[] cs = s.toCharArray();
Arrays.sort(cs);
return String.valueOf(cs);
}
}
class Solution {
public:
string orderlyQueue(string s, int k) {
if (k == 1) {
string ans = s;
for (int i = 0; i < s.size() - 1; ++i) {
s = s.substr(1) + s[0];
if (s < ans) ans = s;
}
return ans;
}
sort(s.begin(), s.end());
return s;
}
};
func orderlyQueue(s string, k int) string {
if k == 1 {
ans := s
for i := 0; i < len(s)-1; i++ {
s = s[1:] + s[:1]
if s < ans {
ans = s
}
}
return ans
}
t := []byte(s)
sort.Slice(t, func(i, j int) bool { return t[i] < t[j] })
return string(t)
}
function orderlyQueue(s: string, k: number): string {
if (k > 1) {
return [...s].sort().join('');
}
const n = s.length;
let min = s;
for (let i = 1; i < n; i++) {
const t = s.slice(i) + s.slice(0, i);
if (t < min) {
min = t;
}
}
return min;
}