「携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情」
今天我们来做一下今天的leetcode每日一题
题目链接在这里 899. 有序队列
题意
题目给到我们一个由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时,直接将原字符串按照字典序排序输出即可
- 对于序列 463751来说,移动过程如下。
代码实现
了解了上面的思路之后,代码实现其实就非常简单了😎。
结束语
如果有更好的分析思路,欢迎大家在评论区发表看法!⛄