需求分析
给定一个字符串 s 和一个整数 k 。你可以从 s 的前 k 个字母中选择一个,并把它加到字符串的末尾。 在应用上述步骤的任意数量的移动后,查找出字典上最小的字符串
java代码
public String orderlyQueue(String s, int k) {
if (k > 1) {
char[] sortChars = s.toCharArray();
Arrays.sort(sortChars);
return new String(sortChars);
}
String minStr = s;
StringBuilder str = new StringBuilder(s);
for (int i = 1; i < s.length(); i++) {
str.append(str.charAt(0));
str.deleteCharAt(0);
if (str.toString().compareTo(minStr) < 0) {
minStr = str.toString();
}
}
return minStr;
}
代码分析
思考了好久,感觉这个方式还是比较不错的,但是有一个特殊的限制条件:当给定的 k 值大于 1 时,只能使用字符串排序的方式进行排序;当 k 值等于 1 时,只能进行一次字符移动操作,即将字符串的第一个字符移到末尾,然后比较新字符串和原字符串的大小,重复该操作直到找到字典序最小的字符串。
具体实现过程
-
如果 k 大于 1,则直接对字符串进行排序,并返回排序后的字符串。
-
如果 k 等于 1,则先将原字符串赋值给 minStr 变量。
-
然后通过循环将字符串的第一个字符移到末尾,并比较新字符串和 minStr 的大小,如果新字符串比 minStr 小,则更新 minStr。重复该操作直到字符串被移动了 s.length() - 1 次。
-
最后返回字典序最小的字符串 minStr。
注意
这个算法的时间复杂度为 O(n^2),其中 n 是字符串的长度,因为在每次循环中都需要对字符串进行一次比较操作。