一、题目
给你下标从 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)