Leetcode每日打卡第8天

题目

 交换后字典序最小的字符串

给你一个仅由数字组成的字符串 s,在最多交换一次 相邻 且具有相同 奇偶性 的数字后,返回可以得到的字典序最小的字符串。

如果两个数字都是奇数或都是偶数,则它们具有相同的奇偶性。例如,5 和 9、2 和 4 奇偶性相同,而 6 和 9 奇偶性不同。

示例 1:

输入: s = "45320"

输出: "43520"

解释:

s[1] == '5' 和 s[2] == '3' 都具有相同的奇偶性,交换它们可以得到字典序最小的字符串。

示例 2:

输入: s = "001"

输出: "001"

解释:

无需进行交换,因为 s 已经是字典序最小的。

提示:

  • 2 <= s.length <= 100
  • s 仅由数字组成。

思路

题目要求我们最多交换一次相邻字符,并且满足交换的两个字符所表示的数字奇偶性相同,使得最终得到的字符串字典序最小。

我们知道,若两个字符串长度相同,则拥有首个不同字符中较小那个的字符串字典序更小,因此我们在枚举相邻两个字符交换时需要尽早的交换,并且交换之前后面的字符要小于前面的字符。

python3代码

class Solution:
    def getSmallestString(self, s: str) -> str:
        s = list(s)
        for i in range(0, len(s) - 1):
            if s[i] > s[i + 1] and ord(s[i]) % 2 == ord(s[i + 1]) % 2:
                s[i], s[i + 1] = s[i + 1], s[i]
                break
        return ''.join(s)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值