📜  每对括号之间的反向子串

📅  最后修改于: 2021-06-26 13:00:52             🧑  作者: Mango

给定一个字符串str ,该字符串由小写英文字母和方括号组成。任务是从最里面的一对开始反转每对匹配括号中的子字符串。结果中不应包含任何括号。

例子:

方法:可以使用堆栈解决此问题。首先,每当一个“(”遇到然后按元素的索引入堆栈中并每当“)”遇到然后获取堆栈作为最新索引的顶部元件和反向电流索引和索引从之间的字符串堆栈的顶部。按照此步骤处理其余的字符串,最后打印更新的字符串。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Function to return the modified string
string reverseParentheses(string str, int len)
{
    stack 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 st = new Stack();
    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 strring
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 substarting
        # after the last encountered opening
        # bracket till the current character
        elif (strr[i] == ')'):
            temp = strr[st[-1]:i + 1]
            strr = strr[:st[-1]] + temp[::-1] + \
                   strr[i + 1:]
            del st[-1]
 
    # To store the modified strring
    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 st = new Stack();
     
    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


输出:
geeksforgeeks

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。