给定只含 "I"
(增大)或 "D"
(减小)的字符串 S
,令 N = S.length
。
返回 [0, 1, ..., N]
的任意排列 A
使得对于所有 i = 0, ..., N-1
,都有:
- 如果
S[i] == "I"
,那么A[i] < A[i+1]
- 如果
S[i] == "D"
,那么A[i] > A[i+1]
示例 1:
输出:"IDID" 输出:[0,4,1,3,2]
示例 2:
输出:"III" 输出:[0,1,2,3]
示例 3:
输出:"DDI" 输出:[3,2,0,1]
提示:
1 <= S.length <= 10000
S
只包含字符"I"
或"D"
。
**难度**: Easy
**标签**: 数学、
# -*- coding: utf-8 -*-
# @Author : LG
"""
执行用时:4752 ms, 在所有 Python3 提交中击败了5.05% 的用户
内存消耗:14.8 MB, 在所有 Python3 提交中击败了16.67% 的用户
算法思想:
两个列表,一个保存需要放入的元素, 一个用来存储结果
如遇到I,则从列表中取出最小值,放入result中
遇到D,则从列表中取出最大值,放入result中
"""
class Solution:
def diStringMatch(self, S: str) -> List[int]:
result = []
list1 = list(range(len(S) + 1))
for s in S:
if s == 'I':
element = min(list1)
result.append(element)
list1.remove(element)
else:
element = max(list1)
result.append(element)
list1.remove(element)
result.extend(list1)
return result
"""
执行用时:76 ms, 在所有 Python3 提交中击败了73.40% 的用户
内存消耗:14.6 MB, 在所有 Python3 提交中击败了16.67% 的用户
解题思路:
由于本题中 需要存入的元素是连续的,所以直接定义俩个变量存储最大值和最小值,省去列表步骤
"""
class Solution:
def diStringMatch(self, S: str) -> List[int]:
result = []
min_, max_ = 0, len(S)
for s in S:
if s == 'I':
result.append(min_)
min_ += 1
else:
result.append(max_)
max_ -= 1
result.append(min_)
return result