Problem
1190. Reverse Substrings Between Each Pair of Parentheses
Insights
Input = "(ed(et(oc))el)"
Output = "leetcode"First closing bracket at index 9, switch indices with its matching opening bracket at 6
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
( |
e | d | ( |
e | t | ( |
o | c | ) |
) |
e | l | ) |
9 |
6 |
Second closing bracket at index 10, switch indices with its matching opening bracket at 3
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
( |
e | d | ( |
e | t | ( |
o | c | ) |
) |
e | l | ) |
10 |
9 |
6 |
3 |
Last closing bracket at index 13, switch indices with its matching opening bracket at 0
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
( |
e | d | ( |
e | t | ( |
o | c | ) |
) |
e | l | ) |
13 |
10 |
9 |
6 |
3 |
0 |
Algorithm
- Scan the input string character by character, and store the indices of
(and)in an array, wherearray[closingIndex] = openingIndex,array[openingIndex] = closingIndexandopeningIndexandclosingIndexare one pair of matching parenthese. - Whenever a parentheis (opening or closing) is encountered, follow the index to the matching bracket and change iteration direction.
Pseudo Code
// 1. read parenthese indices
Let N = S.length
Define an array Pairs of size N
Define a stack Stack
for i = 1 to N
if S[i] == '('
Stack.Push(i)
else if S[i] == ')'
openingIndex = Stack.Pop()
Pairs[i] = openingIndex
Pairs[openingIndex] = i
else // other characters
// do nothing
// 2. reconstruct string
Let SS = ""
for i = 1 to N and d = 1; i += d
if S[i] == '(' or S[i] == ')'
i = Pairs[i]
d *= -1
else
SS += S[i]
return SSComplexity
Time - O(N). The input string is looped twice, one to read bracket indices and one to reconstruct the string.
Space - O(N). A stack and a string builder are used, and they both take O(N) space.