题目描述
给定一个字符串 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
只由小写字母组成。
解法
方法一:分情况判断
若 $k = 1$,我们每次只能将字符串首字符移动到字符串末尾,总共有 $|s|$ 种不同的状态,我们返回其中字典序最小的字符串即可。
若 $k \gt 1$,对于形如 $abc[xy]def$ 的字符串,可以依次将 $a$, $b$, $c$ 移动到最后,得到 $[xy]defabc$,然后将 $y$, $x$ 移动到最后,得到 $defabc[yx]$,最后将 $d$, $e$, $f$ 移动到最后,得到 $abc[yx]def$,这样就实现了对 $y$, $x$ 的交换。
因此,只要 $k \gt 1$,我们就能够交换字符串中的任何两个相邻字符,最终得到一个升序排列的字符串。
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 是字符串的长度。
| 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))
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | 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);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | 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;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | 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)
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | 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;
}
|