解题思路
这道题可以分成两种情况:
-
k=1,当k为1的时候,每次移动都是把首字母移到最后,所以可以把这个字符串看成一个循环的链表,以当前这个字符串中任意一个节点为头,组成的新字符串就是我们能得到的所有的字符串了,取其中字典序较小的字符串即可。
-
k=2,当k为2的时候,我们是可以得到以这个字符串中字符任意排列而成的字符串的。我们可以固定住首字母,这样除了首字母以外,后半截字符串其实就相当于情况1了,所以在这种情况下,我们能得到后半截字符串当前顺序的所有字符串,在这里面的任意一个字符串上,把首字母移到最后,相当于形成了新的后半截字符串,最终是能得到全排列的。这个我也不知道怎么证明,但是在纸上画画就能看出来。
-
k>2 ,我们可以只移动前两个字母,就和k=2一模一样了。
代码
class Solution {
public String orderlyQueue(String s, int k) {
if(k==1){
String ans=s;
String sb= new String();
for (int i=1;i<s.length();i++){
sb=s.substring(i,s.length())+s.substring(0,i);
if (compare(ans,sb)>0) ans=sb;
}
return ans;
}else {
char[] chars=s.toCharArray();
Arrays.sort(chars);
return new String(chars);
}
}
public int compare(String a,String b){
int i=0;
while (i<a.length()&&a.charAt(i)==b.charAt(i)){
i++;
}
if (i==a.length()) return 0;
else if (a.charAt(i)-b.charAt(i)>0) return 1;
else return -1;
}
}