# 1190 -「java」利用 栈+递归 解决『反转每对括号间的子串』的详细解题思路

Tags:

  • 中等
  • 递归
  • 字符串
  • java

题目链接:

1190. 反转每对括号间的子串

解题思路[栈+递归]:

类似的大括号/小括号, 四则运算之类的题目, 第一印象就可以使用栈或者递归来实现, 具体到本题中:

  1. 遍历原字符串, 只要碰到'('时, 则说明直到与该左括号对应的右括号')'时, 此两个位置中间的所有元素都需要反转;
  2. 且因为会存在多组 '(' 与 ')', 所以可以将遍历过程中, 碰到'(', 作为进入递归的判断条件; 碰到')'作为结束递归的判断条件;
  3. 同时, 在每一轮递归运算中, 需要接收下一次递归的调用栈出栈的返回值str, 并将本轮递归中的'(' 与')'中间的所有字符(包括'(' 与')' )替换为str;
  4. 每一轮递归中, 对于'(' 与')'中间元素的反转操作, 可以利用「栈」来实现;

实现代码:

class Solution {

    public static Integer idx=0;

    public String reverseParentheses(String s) {
        //借助栈实现(碰到"(", 创建新栈, 碰到")", 返回)
        StringBuilder sb = new StringBuilder(s);
        reverseSubString(sb, 0);  //调用递归
        return sb.toString();
    }

    //递归函数
    public void reverseSubString(StringBuilder s, Integer start){
        //进入递归时, 创建新栈
        Stack<Character> stack = new Stack<>();

        int curr = start;
        while(curr < s.length()){
            if(s.charAt(curr) == ')'){  // 碰到")", 结束本次递归
                s.replace(start-1, curr+1, getStrFromStack(stack));
                return;
            }
            if(s.charAt(curr) == '('){  //碰到"(", 进入递归
                reverseSubString(s, curr+1);
                continue;
            }
            if(curr < s.length()){
                stack.push(s.charAt(curr));
                curr++;
            }
        }
    }

    //从栈中取出对应字符串
    public String getStrFromStack(Stack<Character> st){
        StringBuilder sb = new StringBuilder();
        while(!st.isEmpty()){
            sb.append(st.pop());
        }
        return sb.toString();
    }
}

提交记录[20210702]:

执行用时:4 ms, 在所有 Java 提交中击败了33.85%的用户
内存消耗:38.5 MB, 在所有 Java 提交中击败了13.47%的用户
posted @ 2023-03-16 14:18  zhiyuanZAG  阅读(35)  评论(0)    收藏  举报