题目要求:

给定一个字符串 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 >= 2时,可以生成任意的字符串,比如a1 b1 S(S表示多个字符),如果交换a1 b1的位置,可以先a1 S b1, 之后 S b1 a1,最后 b1 a1 S,以此类推,任何相邻的两个字符都是可以交换的,从而任意顺序的字符串都可以有,故k>=2的情况下,直接用sort()函数排序即可。

k = 1时,应用最小表示法,首先对初始字符串s+=s,在原始字符串的后面再加一遍原字符串,目的是为了当遍历0~n-1任意一个下标元素时,以其为起点,后面在加n-1个元素,即可组成一个字符串。
接着又分为三种情况:
1.如果s[i+k]==s[j+k] k++。
2.如果s[i+k] > s[j+k] i = i + k + 1,即最小表示不可能以s[i->i+k]开头。
3.如果s[i+k] < s[j+k] j = j + k + 1,即最小表示不可能以s[j->j+k]开头。
考虑对于两个字符串A,B,他们在原字符串S的起始位置分别为i和j,且他们前面的k个字符串均相同,即 A[i……i+k-1] = B[j……j+k-1] 不防先考虑 A[i+k] > B[j+k] 的情况,我们发现起始下标 p满足 i <= p <= i+k 的字符均不能成为答案。因为对于任意一个字符串Si+p(表示以i+p为起始位置的字符串)一定存在字符串 Sj+p 比它更优。我们比较时可以跳过下标 [ i , i+k ] 直接跳到Si+k+1。

时间复杂度:

O(N)O(N)O(N)

代码实现:

class Solution {public:int s_min(string s, int n){int i = 0, j = 1, k = 0;while(i < n && j < n){for(k = 0;k < n && s[i+k] == s[j+k];k ++);s[i+k] > s[j+k] ? i = i+k+1 : j = j+k+1;if(i == j) j ++;}return min(i, j);}string orderlyQueue(string s, int k) {int n = s.size();if(k >= 2){sort(s.begin(), s.end());   return s;} s += s;int t = s_min(s, n);string c = "";for(int i = 0;i < n;i ++) c += s[t ++];return c;}
};

参考文献:

https://blog.csdn.net/tianyuhang123/article/details/54919715
https://blog.csdn.net/Stevenwuxu/article/details/112908995

LeetCode每日一题--有序队列(整理最小表示法)相关推荐

  1. Leetcode每日一题:155.min-stack(最小栈)

    思路:这道题说实话有点坑啊,我是用的vector实现,想到了用一个min记录没push一个元素后栈内的最小值,但太懒了就没改:然后看题解发现,它竟然直接用的栈!!! class MinStack {p ...

  2. 【LeetCode每日一题】——109.有序链表转换二叉搜索树

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...

  3. 【Leetcode 每日一题】514. 自由之路(BFS+优先队列)

    Leetcode 每日一题 题目链接:514. 自由之路 难度: 困难 解题思路: 这道题乍一看,可以选择用动态规划或者BFS来求解.本文使用BFS来进行解答.注意到题中有一个最小的到路径.所以我们可 ...

  4. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  5. leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用

    leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...

  6. LeetCode每日一题——1758. 生成交替二进制字符串的最少操作数

    LeetCode每日一题系列 题目:1758. 生成交替二进制字符串的最少操作数 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个仅由字符 '0' 和 '1' ...

  7. leetcode每日一题·买卖股票问题(Python)

    leetcode每日一题·买卖股票问题(Python) 买卖股票的最佳时机(股票最大利润) 题目链接 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的 ...

  8. LeetCode每日一题——792. 匹配子序列的单词数

    LeetCode每日一题系列 题目:792. 匹配子序列的单词数 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给定字符串 s 和字符串数组 words, 返回 w ...

  9. leetcode每日一题1609. 奇偶树 圣诞节你做奇偶数了没 BFS套模板一遍过

    本文目录 leetcode每日一题1609. 奇偶树 圣诞节你做奇偶数了没 BFS套模板一遍过~ 写在前面 题目 示例 提示 思路 代码实现 执行结果 写在最后 leetcode每日一题1609. 奇 ...

最新文章

  1. 计算机保研去北科大还是大工,全部保研!大工这寝室太牛
  2. The encryption certificate of the relying party trust identified by thumbprint is not valid
  3. 服务总线yali测试_中国信登加快技术测试体系建设支撑系统高质量运行
  4. js中event对象属性和方法
  5. react安装_「React实战」三分钟搭建React开发环境
  6. 关于ax+by+cz的最大不可表数
  7. 容器学习 之 容器的组件(三)
  8. android相册管理,Piktures - 最优雅的相册管理 - Android 应用 - 【最美应用】
  9. 静态属性_Java面试题—内部类和静态内部类的区别
  10. springboot导包显示不存在_(一)SpringBoot搭建基本后端应用
  11. java.lang.ClassCastException(java强制类型转换异常)
  12. go 判断元素是否在slice_golang 判断 两个slice 是否相等
  13. kvm中内存过载使用
  14. cognos java,cognos10用JAVA如何获取passPortID(即实现单点登录)
  15. Tcp ip 网络编程入门(一)
  16. 2月29日,四年一遇的日子!
  17. 【Spring】 No qualifying bean of type ‘java.lang.String‘ available: expected at least 1 bean which qua
  18. 云计算之存储虚拟化 -02
  19. word插入标题之后自动跳到下一页怎么解决?
  20. OS X Mountain Lion高手进阶

热门文章

  1. 最新爱叶解析接口搭建php网站源码 附4k画质测试效果
  2. SKCTF Writeup
  3. 新司机的黑裙战斗机 篇二:入门—新司机的黑群晖指北——软件篇(上)
  4. ORA-01722 无效数字出错原因以及以及分析总结
  5. 网络安全能力认证CCSC管理Ⅰ级认证
  6. kubernetes—ConfigMap 与 Secret
  7. Hadoop3.X环境配置
  8. linux 开机运行命令
  9. 树莓派Linux开机使用root自动运行python的pyqt文件
  10. 解决iphone的短信中心号码设置错误的方案