【蓝桥杯Python组——刷题总结】——根据模式串构造最小数字(力扣)

一、题目

给你下标从 0 开始、长度为n的字符串pattern,它包含两种字符,‘I’ 表示上升,‘D’ 表示下降

你需要构造一个下标从 0 开始长度为n + 1的字符串,且它要满足以下条件:

  • num包含数字‘1’‘9’,其中每个数字至多使用一次。
  • 如果pattern[i] == ‘I’,那么num[i] < num[i + 1]
  • 如果pattern[i] == ‘D’,那么num[i] > num[i + 1]

请你返回满足上述条件字典序最小的字符串num

二、例子

输入

pattern = "IIIDIDDD"

输出

123549876

解释

下标 0 ,1 ,2 和 4 处,我们需要使 num[i] < num[i+1] 。
下标 3 ,5 ,6 和 7 处,我们需要使 num[i] > num[i+1] 。
一些可能的 num 的值为 “245639871” ,“135749862” 和 “123849765” 。
“123549876” 是满足条件最小的数字。
注意,“123414321” 不是可行解因为数字 ‘1’ 使用次数超过 1 次。

三、分析

首先将pattern分为只含ID的子段,
即pattern = "IIIDIDDD"可看为子段1=“IIID”子段2=“IDDD”
这是基于贪心算法原理,子段1=“IIID”上升3次下降1次。
思维图:在这里插入图片描述
子段2=“IDDD”同理上升1次下降3次。
思维图:在这里插入图片描述
时间复杂度O(n)

四、代码

from string import digits #0123456789
pattern = input()
n = len(pattern)
ans = list(digits[1:n+2]) #生成n+1个列表类型的数

i = 0
while i < n:
    if pattern[i] == 'I': #为I时迭代上升
        i += 1
        continue
    d = i #D的起点
    i += 1
    while i < n and pattern[i] == 'D':
        i += 1
    ans[d:i+1] = ans[d:i+1][::-1] #将D字段的数翻转
print(ans)

五、运行结果

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

应用数学

只要想学即可

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值