## 题目描述

Tag : 「双端队列」、「栈」

`输入：s = "(abcd)"`

`输入：s = "(u(love)i)"`

`输入：s = "(ed(et(oc))el)"`

`输入：s = "a(bcdefghijkl(mno)p)q"输出："apmnolkjihgfedcbq"`

• `​s​`​ 中只有小写英文字母和括号
• 我们确保所有括号都是成对出现的

## 双端队列

• 从前往后遍历字符串，将不是​`​)​`​ 的字符串从「尾部」放入队列中
• 当遇到​`​)​`​​ 时，从队列「尾部」取出字符串，直到遇到​`​(​`​ 为止，并对取出字符串进行翻转
• 将翻转完成后字符串重新从「尾部」放入队列
• 循环上述过程，直到原字符串全部出来完成
• 从队列「头部」开始取字符，得到最终的答案

`class Solution {    public String reverseParentheses(String s) {        int n = s.length();        char[] cs = s.toCharArray();        Deque<Character> d = new ArrayDeque<>();        for (int i = 0; i < n; i++) {            char c = cs[i];            if (c == ')') {                StringBuilder path = new StringBuilder();                while (!d.isEmpty()) {                    if (d.peekLast() != '(') {                        path.append(d.pollLast());                    } else {                        d.pollLast();                        for (int j = 0; j < path.length(); j++) d.addLast(path.charAt(j));                        break;                    }                }            } else {                d.addLast(c);            }        }        StringBuilder sb = new StringBuilder();        while (!d.isEmpty()) sb.append(d.pollFirst());        return`

`class Solution {    int N = 2010, he = 0, ta = 0;    char[] d = new char[N], path = new char[N];    public String reverseParentheses(String s) {        int n = s.length();        char[] cs = s.toCharArray();        for (int i = 0; i < n; i++) {            char c = cs[i];            if (c == ')') {                int idx = 0;                while (he < ta) {                    if (d[ta - 1] == '(' && --ta >= 0) {                        for (int j = 0; j < idx; j++) d[ta++] = path[j];                        break;                    } else {                        path[idx++] = d[--ta];                    }                }            } else {                d[ta++] = c;            }        }        StringBuilder sb = new StringBuilder();        while (he < ta) sb.append(d[he++]);        return`
• 时间复杂度：每个​`​(​`​​ 字符只会进出队列一次；​`​)​`​​ 字符串都不会进出队列，也只会被扫描一次；分析的重点在于普通字符，可以发现每个普通字符进出队列的次数取决于其右边的​`​)​`​​ 的个数，最坏情况下每个字符右边全是右括号，因此复杂度可以当做，但实际计算量必然取不满，将普通字符的重复弹出均摊到整个字符串处理过程，可以看作是每个字符串都被遍历常数次，复杂度为
• 空间复杂度：