持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
题目描述
有效括号字符串为空 ""
、"(" + A + ")"
或 A + B
,其中 A
和 B
都是有效的括号字符串,+
代表字符串的连接。
例如,""
,"()"
,"(())()"
和 "(()(()))"
都是有效的括号字符串。
如果有效字符串 s
非空,且不存在将其拆分为 s = A + B
的方法,我们称其为原语(primitive),其中 A
和 B
都是非空有效括号字符串。
给出一个非空有效字符串 s
,考虑将其进行原语化分解,使得:s = P_1 + P_2 + ... + P_k
,其中 P_i
是有效括号字符串原语。
对 s
进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 s
。
示例
输入:s = "(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。
输入:s = "(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每个部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。
输入:s = "()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。
提示
1
<=s.length
<=10
s[i]
为'('
或')'
s
是一个有效括号字符串
栈
在原字符串中,我们需要去除掉最外层的括号,那么可以采用栈来实现,利用其后入先出的特性,将左边括号压入栈中,遇到右边括号时,弹出栈中左边的括号,如果栈不为空,则将当前括号对加入结果中,最后返回结果。
class Solution {
public String removeOuterParentheses(String s) {
StringBuffer res = new StringBuffer();
Stack<Character> stack = new Stack<>();
char[] chStr = s.toCharArray();
// 遍历所有字符
for(char c : chStr){
// 右边括号,将栈中的左边括号弹出
if (c == ')') {
stack.pop();
}
// 不为最外层的括号,拼接进结果中
if (!stack.isEmpty()) {
res.append(c);
}
// 左边括号都入栈
if (c == '(') {
stack.push(c);
}
}
// 返回结果
return res.toString();
}
}