【Leetcode】899. Orderly Queue 899. 有序队列

本文深入探讨了一种在特定条件下优化字符串排序的算法。当K大于1时,通过一系列巧妙的操作,实现了任意相邻字符的交换,从而达到全局最优排序。而对于K等于1的情况,提出了寻找旋转后的最小值作为解决方案。代码实现简洁明了,易于理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1

解法

数学解法
首先,假如能够证明序列里任意相邻字母都可以交换,那肯定可以直接排出最小值

  • K>1时,我们想交换S[i]S[i+1],那么操作出S[i:]+S[:i],然后,由于K至少为2,所以这时候可以先把S[i+1]放到后面去,变成S[i]+S[i+2:]+S[:i]+S[i+1],然后再放S[i],得到S[i+2:]+S[:i]+S[i+1]+S[i],最后再依次把S[i+2:]这部分移回去就好,得到S[:i]+S[i+1]+S[i]+S[i+2:],完成交换
  • K=1时,就不行了,我们只能得到S的rotation,从里面找一个最小的就好
class Solution(object):
    def orderlyQueue(self, S, K):
        """
        :type S: str
        :type K: int
        :rtype: str
        """
        if K>1:
            return "".join(sorted(S))
        ans = S
        n = len(S)
        for i in xrange(1,n):
            ans = min(ans,S[i:]+S[:i])
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值