题目
由范围 内所有整数组成的 个整数的排列序列可以表示为长度为n + 1
的字符串 ,其中n属于[0,n]
- 如果 ,那么
perm[i] < perm[i + 1]
s[i] == 'I'
- 如果 ,那么
perm[i] > perm[i + 1]
s[i] == 'D'
给定一个字符串 ,重构排列 并返回它。如果有多个有效排列perm,则返回其中 任何一个 。s
perm
示例 1:
输入:s = "IDID"
输出:[0,4,1,3,2]
示例 2:
输入:s = "III"
输出:[0,1,2,3]
示例 3:
输入:s = "DDI"
输出:[3,2,0,1]
分析
根据实例 D,I对应两个数之间的关系,
因此靠前的D对应的前一个数应该是较大的数,靠后的I对应的后一个数应该是较小的数
按照此想法,令d为n,表示从最大的数开始赋值;i为0,表示从最小的数开始赋值
第一个D的前一个数赋最大值n,第一个I的前一个数赋最小值0
第二个D的前一个数赋第二大值n-1,第二个I的前一个数赋第二小值1······
以此类推,得到有效排列perm。
代码
class Solution:
def diStringMatch(self, s: str) -> List[int]:
i = 0
d = n = len(s)
perm = [0] * (n + 1)
for j, ch in enumerate(s):
if ch == 'I':
perm[j] = i
i += 1
else:
perm[j] = d
d -= 1
perm[n] = i
return perm