Reverse substrings between each pair of parenthesis
Last Updated :
18 Oct, 2023
Given a string str that consists of lowercase English letters and brackets. The task is to reverse the substrings in each pair of matching parentheses, starting from the innermost one. The result should not contain any brackets.
Examples:
Input: str = "(skeeg(for)skeeg)"
Output: geeksforgeeks
Input: str = "((ng)ipm(ca))"
Output: camping
Approach: This problem can be solved using a stack. First, whenever a '(' is encountered then push the index of the element into the stack, and whenever a ')' is encountered then get the top element of the stack as the latest index and reverse the string between the current index and index from the top of the stack. Follow this for the rest of the string and finally print the updated string.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
// Function to return the modified string
string reverseParentheses(string str, int len)
{
stack<int> st;
for (int i = 0; i < len; i++) {
// Push the index of the current
// opening bracket
if (str[i] == '(') {
st.push(i);
}
// Reverse the substring starting
// after the last encountered opening
// bracket till the current character
else if (str[i] == ')') {
reverse(str.begin() + st.top() + 1,
str.begin() + i);
st.pop();
}
}
// To store the modified string
string res = "";
for (int i = 0; i < len; i++) {
if (str[i] != ')' && str[i] != '(')
res += (str[i]);
}
return res;
}
// Driver code
int main()
{
string str = "(skeeg(for)skeeg)";
int len = str.length();
cout << reverseParentheses(str, len);
return 0;
}
Java
// Java implementation of the approach
import java.io.*;
import java.util.*;
class GFG {
static void reverse(char A[], int l, int h)
{
if (l < h)
{
char ch = A[l];
A[l] = A[h];
A[h] = ch;
reverse(A, l + 1, h - 1);
}
}
// Function to return the modified string
static String reverseParentheses(String str, int len)
{
Stack<Integer> st = new Stack<Integer>();
for (int i = 0; i < len; i++)
{
// Push the index of the current
// opening bracket
if (str.charAt(i) == '(')
{
st.push(i);
}
// Reverse the substring starting
// after the last encountered opening
// bracket till the current character
else if (str.charAt(i) == ')')
{
char[] A = str.toCharArray();
reverse(A, st.peek() + 1, i);
str = String.copyValueOf(A);
st.pop();
}
}
// To store the modified string
String res = "";
for (int i = 0; i < len; i++)
{
if (str.charAt(i) != ')' && str.charAt(i) != '(')
{
res += (str.charAt(i));
}
}
return res;
}
// Driver code
public static void main (String[] args)
{
String str = "(skeeg(for)skeeg)";
int len = str.length();
System.out.println(reverseParentheses(str, len));
}
}
// This code is contributed by avanitrachhadiya2155
Python3
# Python3 implementation of the approach
# Function to return the modified string
def reverseParentheses(strr, lenn):
st = []
for i in range(lenn):
# Push the index of the current
# opening bracket
if (strr[i] == '('):
st.append(i)
# Reverse the substring starting
# after the last encountered opening
# bracket till the current character
else if (strr[i] == ')'):
temp = strr[st[-1]:i + 1]
strr = strr[:st[-1]] + temp[::-1] + \
strr[i + 1:]
del st[-1]
# To store the modified string
res = ""
for i in range(lenn):
if (strr[i] != ')' and strr[i] != '('):
res += (strr[i])
return res
# Driver code
if __name__ == '__main__':
strr = "(skeeg(for)skeeg)"
lenn = len(strr)
st = [i for i in strr]
print(reverseParentheses(strr, lenn))
# This code is contributed by Mohit Kumar
C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
using System.Text;
class GFG{
static void reverse(char[] A, int l, int h)
{
if (l < h)
{
char ch = A[l];
A[l] = A[h];
A[h] = ch;
reverse(A, l + 1, h - 1);
}
}
// Function to return the modified string
static string reverseParentheses(string str, int len)
{
Stack<int> st = new Stack<int>();
for(int i = 0; i < len; i++)
{
// Push the index of the current
// opening bracket
if (str[i] == '(')
{
st.Push(i);
}
// Reverse the substring starting
// after the last encountered opening
// bracket till the current character
else if (str[i] == ')')
{
char[] A = str.ToCharArray();
reverse(A, st.Peek() + 1, i);
str = new string(A);
st.Pop();
}
}
// To store the modified string
string res = "";
for(int i = 0; i < len; i++)
{
if (str[i] != ')' && str[i] != '(')
{
res += str[i];
}
}
return res;
}
// Driver code
static public void Main()
{
string str = "(skeeg(for)skeeg)";
int len = str.Length;
Console.WriteLine(reverseParentheses(str, len));
}
}
// This code is contributed by rag2127
JavaScript
<script>
// Javascript implementation of the approach
function reverse(A,l,h)
{
if (l < h)
{
let ch = A[l];
A[l] = A[h];
A[h] = ch;
reverse(A, l + 1, h - 1);
}
}
// Function to return the modified string
function reverseParentheses(str,len)
{
let st = [];
for (let i = 0; i < len; i++)
{
// Push the index of the current
// opening bracket
if (str[i] == '(')
{
st.push(i);
}
// Reverse the substring starting
// after the last encountered opening
// bracket till the current character
else if (str[i] == ')')
{
let A = [...str]
reverse(A, st[st.length-1] + 1, i);
str = [...A];
st.pop();
}
}
// To store the modified string
let res = "";
for (let i = 0; i < len; i++)
{
if (str[i] != ')' && str[i] != '(')
{
res += (str[i]);
}
}
return res;
}
// Driver code
let str = "(skeeg(for)skeeg)";
let len = str.length;
document.write(reverseParentheses(str, len));
// This code is contributed by patel2127
</script>
Time Complexity: O(n2), where n is the length of the given string.
Auxiliary Space: O(n)
Efficient Approach:
Our Approach is simple and we can reduce the space complexity from O(n) to O(1) that is constant space .
Approach:
We create a function for reversing substrings between the opening and closing brackets one by one, beginning with the innermost one. We can use a while loop to keep doing this until we run out of brackets.
In each iteration of the while loop, we first find the index of the string's initial closing bracket. We exit the loop if there is no closing bracket. Otherwise, we search backwards from the closing bracket to identify the appropriate starting bracket.
The reverseSubstring function is then used to reverse the substring between the opening and closing brackets. Finally, we use the erase function to delete the opening and closing brackets from the string.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
string reverseSubstring(string str, int start, int end) {
reverse(str.begin()+start, str.begin()+end+1);
return str;
}
string reverseParentheses(string str) {
int n = str.length();
int start, end;
while (true) {
// find the first closing bracket
end = str.find(')', 0);
if (end == string::npos) {
break; // no more closing brackets, we're done
}
// find the corresponding opening bracket
start = str.rfind('(', end);
// reverse the substring between the opening and closing brackets
str = reverseSubstring(str, start+1, end-1);
// remove the opening and closing brackets
str.erase(start, 1);
str.erase(end-1, 1);
}
return str;
}
int main() {
string str="(skeeg(for)skeeg)";
cout<<reverseParentheses(str)<<endl;
return 0;
}
Java
import java.util.Stack;
public class GFG {
static String ReverseSubstring(String str, int start,
int end)
{
StringBuilder reversed = new StringBuilder();
for (int i = end; i >= start; i--) {
reversed.append(str.charAt(i));
}
return str.substring(0, start) + reversed.toString()
+ str.substring(end + 1);
}
static String ReverseParentheses(String str)
{
int start, end;
while (true) {
// find the first closing bracket
end = str.indexOf(')');
if (end == -1) {
break; // no more closing brackets, we're
// done
}
// find the corresponding opening bracket
start = str.lastIndexOf('(', end);
// reverse the substring between the opening and
// closing brackets
str = ReverseSubstring(str, start + 1, end - 1);
// remove the opening and closing brackets
str = str.substring(0, start)
+ str.substring(start + 1, end)
+ str.substring(end + 1);
}
return str;
}
public static void main(String[] args)
{
String str = "(skeeg(for)skeeg)";
System.out.println(ReverseParentheses(str));
}
}
Python3
def reverse_substring(s, start, end):
return s[:start] + s[start:end+1][::-1] + s[end+1:]
def reverse_parentheses(s):
while True:
end = s.find(')')
if end == -1:
break
start = s.rfind('(', 0, end)
s = reverse_substring(s, start+1, end-1)
s = s[:start] + s[start+1:]
s = s[:end-1] + s[end:]
return s
if __name__ == "__main__":
s = "(skeeg(for)skeeg)"
print(reverse_parentheses(s))
C#
using System;
using System.Text;
class Program
{
static string ReverseSubstring(string str, int start, int end)
{
StringBuilder reversed = new StringBuilder();
for (int i = end; i >= start; i--)
{
reversed.Append(str[i]);
}
return str.Substring(0, start) + reversed.ToString() + str.Substring(end + 1);
}
static string ReverseParentheses(string str)
{
int start, end;
while (true)
{
// find the first closing bracket
end = str.IndexOf(')');
if (end == -1)
{
break; // no more closing brackets, we're done
}
// find the corresponding opening bracket
start = str.LastIndexOf('(', end);
// reverse the substring between the opening and closing brackets
str = ReverseSubstring(str, start + 1, end - 1);
// remove the opening and closing brackets
str = str.Substring(0, start) + str.Substring(start + 1, end - start - 1) + str.Substring(end + 1);
}
return str;
}
static void Main(string[] args)
{
string str = "(skeeg(for)skeeg)";
Console.WriteLine(ReverseParentheses(str));
}
}
JavaScript
function reverseSubstring(str, start, end) {
return str.slice(0, start) +
str.slice(start, end+1).split('').reverse().join('') +
str.slice(end+1);
}
function reverseParentheses(str) {
let start, end;
while (true) {
// find the first closing bracket
end = str.indexOf(')');
if (end === -1) {
break; // no more closing brackets, we're done
}
// find the corresponding opening bracket
start = str.lastIndexOf('(', end);
// reverse the substring between the opening and closing brackets
str = reverseSubstring(str, start+1, end-1);
// remove the opening and closing brackets
str = str.slice(0, start) + str.slice(start+1, end) + str.slice(end+1);
}
return str;
}
let str = "(skeeg(for)skeeg)";
console.log(reverseParentheses(str));
Time Complexity: O(n^2), where n is the length of the given string.
Auxiliary Space: O(1),No extra space is used.
Similar Reads
Score of Parentheses using Tree
Given a string str which contains pairs of balanced parentheses, the task is to calculate the score of the given string based on the given rules: "()" has a score of 1."x y" has a score of x + y where x and y are individual pairs of balanced parentheses."(x)" has a score twice of x (i.e), the score
9 min read
C++ Program To Print Reverse of a String Using Recursion
Write a recursive function to print the reverse of a given string. Code: C++ // C++ program to reverse a string using recursion #include <bits/stdc++.h> using namespace std; /* Function to print reverse of the passed string */ void reverse(string str) { if(str.size() == 0) { return; } reverse
2 min read
How to Reverse a String in Place in C++?
In C++, reversing a string is a basic operation in programming that is required in various applications, from simple and complex algorithms. Reversing a string in place involves changing the characters of the string directly without using input-dependent additional storage. In this article, we learn
2 min read
How to Reverse a String in C++?
Reversing a string means replacing the first character with the last character, second character with the second last character and so on. In this article, we will learn how to reverse a string in C++.ExamplesInput: str = "Hello World"Output: dlroW olleHExplanation: The last character is replaced by
2 min read
Reverse words in a given string | Set 2
Given string str, the task is to reverse the string by considering each word of the string, str as a single unit. Examples: Input: str = âgeeks quiz practice codeâOutput: code practice quiz geeks Explanation: The words in the given string are [âgeeksâ, âquizâ, âpracticeâ, âcodeâ]. Therefore, after r
9 min read
Reverse middle words of a string
Given a string str, print reverse all words except the first and last words. Examples: Input : Hi how are you geeks Output : Hi woh era uoy geeks Input : I am fine Output : I ma finePrint the first word.For remaining middle words, print the reverse of every word after reaching end of it. This will p
4 min read
C++ Program To Reverse Words In A Given String
Example: Let the input string be "i like this program very much". The function should change the string to "much very program this like i" Examples: Input: s = "geeks quiz practice code" Output: s = "code practice quiz geeks" Input: s = "getting good at coding needs a lot of practice" Output: s = "p
7 min read
C++ Program to Reverse a String Using Stack
Given a string, reverse it using stack. For example "GeeksQuiz" should be converted to "ziuQskeeG". Following is simple algorithm to reverse a string using stack. 1) Create an empty stack.2) One by one push all characters of string to stack.3) One by one pop all characters from stack and put them ba
4 min read
How to Parse Mathematical Expressions in a C++ String?
In C++, strings are sequences of characters stored in a char array. Strings are used to store words and text. We can also store mathematical expressions in this string. In this article, we will explore how to parse mathematical expressions in a C++ String. Example: Input:expression = (3 + 4) * 2 / (
5 min read
Program to reverse words in a given string in C++
Given a sentence in the form of string str, the task is to reverse each word of the given sentence in C++. Examples: Input: str = "the sky is blue" Output: blue is sky theInput: str = "I love programming" Output: programming love I Method 1: Using STL functions Reverse the given string str using STL
6 min read