美文网首页
899. 有序队列(难度:困难)

899. 有序队列(难度:困难)

作者: 一直流浪 | 来源:发表于2022-11-28 14:41 被阅读0次

题目描述:https://leetcode.cn/problems/orderly-queue/

题目描述:

给定一个字符串 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 只由小写字母组成。

解法:

根据题目描述,可以分为两种情况:

(1)当 k = 1时,我们可以把队列看做是一个循环队列,我们只需要遍历起点,得到最大字符串。

(2)当 k > 1 时,这种情况下,字符串是可以做到,其中的每个字符是可以任意更换位置的,所以我们只需要将字符串进行排序,得到最小的字符串即可。

class Solution {
    public String orderlyQueue(String s, int k) {
        if(k == 1) {
            String temp = s;
            StringBuilder stringBuilder = new StringBuilder(s);
            int i = 1;
            while (i < s.length()) {
                char c = stringBuilder.charAt(0);
                stringBuilder.deleteCharAt(0);
                stringBuilder.append(c);
                if(stringBuilder.toString().compareTo(temp) < 0) {
                    temp = stringBuilder.toString();
                }
                i++;
            }
            return temp;
        } else {
            final char[] chars = s.toCharArray();
            Arrays.sort(chars);
            return new String(chars);
        }
    }
}

相关文章

网友评论

      本文标题:899. 有序队列(难度:困难)

      本文链接:https://www.haomeiwen.com/subject/ficagrtx.html