返回

创意刷题第 61 弹:用字母玩转单调递增的艺术

后端

一、题目

继续做一些 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 由小写英文字母组成

二、解题思路

这一题是一道很有趣的字符串题目,要求我们将一个字符串翻转成单调递增的。乍一看,可能觉得有些困难,但只要我们仔细分析题目要求,就会发现其实并没有那么复杂。

首先,我们可以先将字符串中的字母按照从小到大的顺序排序。这样,我们就可以得到一个有序的字母序列。然后,我们只需要将这个有序的字母序列插入到原字符串中,就可以得到一个单调递增的字符串了。

当然,在插入字母的时候,我们需要考虑以下几点:

  1. 对于相邻的两个字母,如果后一个字母大于前一个字母,那么我们就需要在它们之间插入一个字母。
  2. 对于相邻的两个字母,如果后一个字母等于前一个字母,那么我们就需要在它们之间插入一个比前一个字母大的字母。
  3. 对于相邻的两个字母,如果后一个字母小于前一个字母,那么我们就需要在它们之间插入一个比前一个字母小的字母。

通过这样的操作,我们就可以将原字符串翻转成一个单调递增的字符串了。

三、代码实现

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 题的详细解题过程。希望这篇文章能够帮助你更好地理解这道题的解法,并能够在未来的刷题之旅中更加游刃有余。

好了,今天的刷题日记就到这里。希望大家能够继续关注我的刷题日记,一起进步,一起成长!