给出一个字符串 s
(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。
注意,您的结果中 不应 包含任何括号。
示例 1:
输入:s = "(abcd)" 输出:"dcba"
示例 2:
输入:s = "(u(love)i)" 输出:"iloveu"
示例 3:
输入:s = "(ed(et(oc))el)" 输出:"leetcode"
示例 4:
输入:s = "a(bcdefghijkl(mno)p)q" 输出:"apmnolkjihgfedcbq"
提示:
0 <= s.length <= 2000
s
中只有小写英文字母和括号- 我们确保所有括号都是成对出现的
code
//一个栈(括号匹配必须用栈实现)+一个队列
//一对括号翻转一次:一次出栈入队+出队入栈
class Solution {
public String reverseParentheses(String s) {
if(s.length()<=1) return s;
Stack<Character> st=new Stack<>();
Queue<Character> q=new LinkedList<>();
for(int i=s.length()-1;i>=0;i--){//从后向前遍历字符串
char c=s.charAt(i);
if(c=='('){//出栈并入队直到遇到')',括号不入队
while(st.peek()!=')') q.add(st.pop());//出栈
st.pop();//抵消右括号!!!
while(!q.isEmpty()) st.push(q.poll());//再全部入栈,实现一次翻转
}
else st.push(c);
}
//res即为当前栈的出栈顺序
StringBuilder res=new StringBuilder();
while(!st.isEmpty()) res.append(st.pop());
return res.toString();
}
}