You are given a string s
that consists only of the characters 'I'
(increase) and 'D'
(decrease). Assume that s
has a length n
. You need to find a permutation perm
of the integers from 0
to n
such that for all i
:
s[i] == 'I'
, then perm[i] < perm[i + 1]
s[i] == 'D'
, then perm[i] > perm[i + 1]
n
?
To solve this problem, we can use a two-pointer technique. Start with the smallest and largest possible numbers, and place them based on the characters in the string:
low
to 0 and high
to n
(where n
is the length of the string s
).s
and construct the permutation:
'I'
, set the current position in the permutation to low
and increment low
.'D'
, set the current position in the permutation to high
and decrement high
.low
(which should be equal to high
at that point).This approach ensures that all conditions are met with a time complexity of O(n).
def diStringMatch(s: str):
n = len(s)
low, high = 0, n
perm = []
for char in s:
if char == 'I':
perm.append(low)
low += 1
else:
perm.append(high)
high -= 1
# Append the last remaining number which should be same for both low and high
perm.append(low) # low and high are the same at this point
return perm
# Example Usage
s = "IDID"
print(diStringMatch(s)) # Output should be a valid permutation like [0, 4, 1, 3, 2]
n
is the length of the string s
. We make a single pass through the string to determine the permutation.n
is the length of the string s
, due to the storage requirement of the output list perm
.Got blindsided by a question you didn’t expect?
Spend too much time studying?
Or simply don’t have the time to go over all 3000 questions?