[路飞]_Leetcode 899. 有序队列

81 阅读2分钟

「携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

今天我们来做一下今天的leetcode每日一题

题目链接在这里 899. 有序队列

题意

image.png

题目给到我们一个由a-z范围字符组成的字符串,我们可以进行任意数量的操作对字符串进行转换,这种操作是选择字符串的前k个字符中的一个字符,将它移动为末尾。问我们,给定一个字符串和数字k,求转换后的字典序最小的字符串。

思路

我们可以发现如果k==1,会比较容易处理,k>1时会有些无从下手,所以下面对k进行分类讨论。

  • 如果k==1,依次将s中的每个字符 放到s结尾,在这个过程中去字典序最小的
  • 对于k==2,由于移动次数不限,我们总能在一轮操作中将最大值放到最后一位,下一轮将次大值放到倒数第二位
    • 对于序列 463751来说,移动过程如下。
      • 第一轮操作由于k==2,我们可以选择每次将第一个字符放到末尾,直到遇到最大的字符

        • 4637514 -> 6375146 -> 3751463 -> 7514637
      • 第二轮操作,继续移动首个字符,遇到次大字符时,就将另外一位移动到末尾,直到次大值和最大值在前两位,过程如下

        • 7514637 -> 5146375 -> 1463751 -> 4637514 -> 3675143 -> 6751436 -> 7514367
      • 第三轮操作 移动第三大值的过程和移动次大值的方法一致

        • 7514367 -> 1543671 -> 4536714 -> 3567143 -> 5671435 -> 6714356 -> 7143567
      • ...

      • 最终,每次移动都可以将最大的几个数排序好放到字符串的后面,这样在经过若干次移动就可以将原字符串转化成 字典序最小字符串

    既然如此,对于每个字符串,我们总能将它装换成字典序最小字符串。那么,当k>1时,直接将原字符串按照字典序排序输出即可

代码实现

了解了上面的思路之后,代码实现其实就非常简单了😎。 image.png

结束语

如果有更好的分析思路,欢迎大家在评论区发表看法!⛄