返回介绍

solution / 0800-0899 / 0899.Orderly Queue / README

发布于 2024-06-17 01:03:33 字数 3333 浏览 0 评论 0 收藏 0

899. 有序队列

English Version

题目描述

给定一个字符串 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))
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);
  }
}
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;
  }
};
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)
}
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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文