- 如果
perm[i] < perm[i + 1]
,那么s[i] == 'I'
- 如果
perm[i] > perm[i + 1]
,那么s[i] == 'D'
给定一个字符串 s
,重构排列 perm
并返回它。如果有多个有效排列perm,则返回其中 任何一个 。
示例 1:
输入:s = "IDID"
输出:[0,4,1,3,2]
示例 2:
输入:s = "III"
输出:[0,1,2,3]
示例 3:
输入:s = "DDI"
输出:[3,2,0,1]
提示:
1 <= s.length <= 10^5
s
只包含字符"I"
或"D"
思路与算法
第一感:碰到“I”就从剩下的数中选最小的,碰到“D”就从剩下数中选择最大的。
设置两个指针,一个从小往大数,一个从大往小数。
需要注意不要漏了最后一个数(输入字符串的长度比待恢复的序列长度小1)。
以上这算是一个贪心算法。严格地来说需要证明它为什么一定能产生正确解。不过这个比代码难多了,想明白一个事情跟说明白一个事情有巨大的差距。官解解释如下,确实有道理。。。
代码实现
class Solution:
def diStringMatch(self, s: str) -> List[int]:
ans = []
lptr = 0
rptr = len(s)
for i in range(len(s)):
if s[i]=="I":
ans.append(lptr)
lptr += 1
else:
ans.append(rptr)
rptr -= 1
ans.append(lptr)
return ans
执行用时:40 ms, 在所有 Python3 提交中击败了80.90%的用户
内存消耗:16 MB, 在所有 Python3 提交中击败了13.26%的用户
回到总目录:Leetcode每日一题总目录(动态更新。。。)