反转每对括号里的子串

给出一个字符串 s(仅含有小写英文字母和括号)。app

请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。ui

注意,您的结果中 不该 包含任何括号。code

示例 1:递归

输入:s = "(abcd)"
输出:"dcba"
示例 2:leetcode

输入:s = "(u(love)i)"
输出:"iloveu"
示例 3:字符串

输入:s = "(ed(et(oc))el)"
输出:"leetcode"
示例 4:io

输入:s = "a(bcdefghijkl(mno)p)q"
输出:"apmnolkjihgfedcbq"class

提示:英文

0 <= s.length <= 2000
s 中只有小写英文字母和括号
咱们确保全部括号都是成对出现的while

解:递归

利用stack来存储' ( '的角标位置,遇到‘(’则将其角标压入栈;遇到‘)’则将栈顶的角标弹出,并将该角标与‘ )’之间的字符串反转

class Solution {

    public String reverseParentheses(String s) {

        Stack<Integer> stack = new Stack<>();

        StringBuilder st = new StringBuilder();

        int num = s.length();

        char[] arr = s.toCharArray();

        for(int i = 0; i < num; i++){

            if(arr[i] == '('){

                stack.push(i);

            }else if(arr[i] == ')'){

                reverse(arr,stack.pop() + 1, i - 1);

            }

        }

        for(int i = 0; i < num; i++){

            if(arr[i] != '(' && arr[i] != ')'){

                st.append(arr[i]);

            }

        }

        return st.toString();

    }

    public void reverse(char[] c, int i, int j){

        while(i < j){

            char temp = c[i];

            c[i] = c[j];

            c[j] = temp;

            i++;

            j--;

        }   

    }

}