返回
创意刷题第 61 弹:用字母玩转单调递增的艺术
后端
2023-10-21 01:22:48
一、题目
继续做一些 leetcode 的题目,今日份题目是:「将字符串翻转到单调递增」。
给你一个由小写字母组成的字符串 s,你可以在任意位置插入任意数量的 小写字母 ,目的是使字符串变成一个 单调递增字符串 。
单调递增字符串 定义为:对于字符串中任意相邻的两个字母 a 和 b,满足 a <= b。
返回使 s 单调递增的最小 字符串 。
示例 1:
输入:s = "aaaabbbbcccc"
输出:"abccbaabccba"
解释:插入一个 'c' 使 s 变为 "aaacbbbcccc",再把 "aaacbbbcccc" 变成 "abccbaabccba"。
示例 2:
输入:s = "leetcode"
输出:"leetcode"
解释:s 本身就是单调递增,因此无需插入任何字符。
提示:
1 <= s.length <= 50
s 由小写英文字母组成
二、解题思路
这一题是一道很有趣的字符串题目,要求我们将一个字符串翻转成单调递增的。乍一看,可能觉得有些困难,但只要我们仔细分析题目要求,就会发现其实并没有那么复杂。
首先,我们可以先将字符串中的字母按照从小到大的顺序排序。这样,我们就可以得到一个有序的字母序列。然后,我们只需要将这个有序的字母序列插入到原字符串中,就可以得到一个单调递增的字符串了。
当然,在插入字母的时候,我们需要考虑以下几点:
- 对于相邻的两个字母,如果后一个字母大于前一个字母,那么我们就需要在它们之间插入一个字母。
- 对于相邻的两个字母,如果后一个字母等于前一个字母,那么我们就需要在它们之间插入一个比前一个字母大的字母。
- 对于相邻的两个字母,如果后一个字母小于前一个字母,那么我们就需要在它们之间插入一个比前一个字母小的字母。
通过这样的操作,我们就可以将原字符串翻转成一个单调递增的字符串了。
三、代码实现
def make_string_monotone_increasing(s):
"""
将字符串翻转到单调递增
Args:
s: 输入字符串
Returns:
单调递增的字符串
"""
# 将字符串中的字母按照从小到大的顺序排序
sorted_chars = sorted(s)
# 定义一个新的字符串
new_str = ""
# 遍历排序后的字母序列
for i in range(len(sorted_chars)):
# 获取当前字母
char = sorted_chars[i]
# 如果当前字母大于上一个字母,则在它们之间插入一个字母
if i > 0 and char > new_str[-1]:
new_str += char
# 如果当前字母等于上一个字母,则在它们之间插入一个比上一个字母大的字母
elif i > 0 and char == new_str[-1]:
new_str += chr(ord(char) + 1)
# 如果当前字母小于上一个字母,则在它们之间插入一个比上一个字母小的字母
else:
new_str += char
# 返回单调递增的字符串
return new_str
# 测试代码
s = "aaaabbbbcccc"
print(make_string_monotone_increasing(s)) # abccbaabccba
s = "leetcode"
print(make_string_monotone_increasing(s)) # leetcode
四、总结
以上就是力扣第 926 题的详细解题过程。希望这篇文章能够帮助你更好地理解这道题的解法,并能够在未来的刷题之旅中更加游刃有余。
好了,今天的刷题日记就到这里。希望大家能够继续关注我的刷题日记,一起进步,一起成长!