查看题目详情可点击此处。
题目
有效括号字符串为空 ("")、"(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串。
如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。
给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。
对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S 。
示例 1:
输入:"(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。
示例 2:
输入:"(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每隔部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。
示例 3:
输入:"()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。
解题思路
首先需要标识是否已读到最外层左括号,在读到最外层左括号后顺序读取的字符串应该可以形成有效的括号对,直至出现一个无左括号匹配的右括号,此时已经读取到这段有效括号字符串的最外层,将标识恢复以进行下一次匹配,而括号的有效性使用一个栈来完成。接下来是代码:
class Solution {
public String removeOuterParentheses(String S) {
StringBuffer result = new StringBuffer();
char[] chars = S.toCharArray();
boolean isOuterLeft = false;
for(char c : chars) {
if('(' == c) {
if(!isOuterLeft) {
isOuterLeft = true;
} else {
result.append(c);
parenthesesStack.push(c);
}
} else if(')' == c) {
if(parenthesesStack.matchParentheses(c)) {
parenthesesStack.pop();
result.append(c);
} else {
isOuterLeft = false;
}
}
}
return result.toString();
}
private class ParenthesesStack {
protected int size;
protected int topIndex = 0;
protected char[] stack;
public ParenthesesStack(int size) {
this.size = size;
stack = new char[size];
}
public void push(char data) {
if(topIndex == size) {return;}
stack[topIndex] = data;
++topIndex;
}
public Character pop() {
if(topIndex == 0) {
return null;
}
char stackTop = stack[topIndex - 1];
--topIndex;
return stackTop;
}
public boolean matchParentheses(char c) {
if(topIndex == 0) {
return false;
}
return ')' == c && '(' == stack[topIndex - 1];
}
}
private ParenthesesStack parenthesesStack = new ParenthesesStack(1024);
}