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


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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-substrings-between-each-pair-of-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.Deque;
import java.util.LinkedList;

class Solution {
    public String reverseParentheses(String s) {
        Deque stack = new LinkedList();
        StringBuilder ans = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                stack.push(ans.toString());
                ans.setLength(0);
            } else if (s.charAt(i) == ')') {
                ans.reverse();
                ans.insert(0, stack.pop());
            } else {
                ans.append(s.charAt(i));
            }
        }
        return ans.toString();
    }
}

预处理

import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;

class Solution {
    public String reverseParentheses(String s) {
        Deque stack = new LinkedList<>();
        int[] pairs = new int[s.length()];
        for (int i = 0; i < s.length(); ++i) {
            if (s.charAt(i) == '(') {
                stack.push(i);
            } else if (s.charAt(i) == ')') {
                int pop = stack.pop();
                pairs[pop] = i;
                pairs[i] = pop;
            }
        }
        StringBuilder ans = new StringBuilder();
        int index = 0, step = 1;
        while (index < s.length()) {
            if (s.charAt(index) == '(' || s.charAt(index) == ')') {
                step = -step;
                index = pairs[index];
            } else {
                ans.append(s.charAt(index));
            }
            index += step;
        }
        return ans.toString();
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            System.out.println(new Solution().reverseParentheses(in.next()));
        }
    }
}