参考资料:
题目描述
示例
思路
对k
进行分类讨论:
- 当
k
为1时,每次只能把最前面的字符移动到最后面,相当于让原字符串首尾相接,然后再从中切开,找到最好的切法。 - 当
k>=2
时,该问题等价于求升序排序后的原字符串。证明:考虑对任意两个相邻的字符a
和b
(在字符串s
中的原下标分别为i
和i+1
),通过一定的操作,可以使这两个字符交换位置,而其他字符的位置均不发生改变。具体操作为:不断将第一个字符移动到最后面,直到a
为第一个字符为止,然后将b
移动到最后面,再将a
移动到最后面,最后不断将第一个字符移动到最后面,直到b
的下标为i
为止。这样,就完成了a
和b
的交换。考虑到,冒泡排序的本质就是不断地将相邻的两个元素进行交换,最终使原序列升序,所以当k>=2
时,可以通过不断地交换相邻字符的顺序,达到升序排序的结果。换言之,k>=2
时的答案就是原字符串的升序排序。
代码
class Solution {
public:
string orderlyQueue(string s, int k) {
string ans = s;
if(k==1){
int len = s.size();
s = s+s;
for(int i=0;i<len;i++){
string temp = s.substr(i, len);
if(temp<ans) ans = temp;
}
}else{
sort(ans.begin(), ans.end());
}
return ans;
}
};