题目
有效括号字符串为空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括号字符串,+
代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B
都是非空有效括号字符串。给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + … + P_k,其中 P_i
是有效括号字符串原语。对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S 。
分析
实现原语化分解,其实本质就是括号配对,只要不把外层括号加入要返回的字符串中即可
如何判断是否是外层的括号:
- c为左括号,且入栈前栈为空
- c为右括号,且栈顶左括号出栈后栈为空
代码
class Solution {
public static String removeOuterParentheses(String S) {
/** 栈处理法:
* 一个栈来判断对字符串进行原语的处理(栈恰好为空的情况) */
Stack<Character> stack = new Stack<>();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < S.length(); i++) {
char c = S.charAt(i);
//怎么判断是外层括号?1.c为左括号且入栈前栈为空 2.c为右括号且栈顶左括号出栈后栈为空
if (c == '(') {
if (!stack.isEmpty())
builder.append(c);
stack.push(c);
}
else {
stack.pop();
if (!stack.isEmpty())
builder.append(c);
}
}
return builder.toString();
}
}