删除最外层的括号
有效括号字符串为空 ("")
、"(" + 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
输入:"()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。
解题思路
本题主要问题在于:找出最外层括号的位置。
我们记 “(” 出现的次数为 Lx ,“)” 出现的次数为 Rx。
示例 1 输入内容如下图所示:
次数 | 次数 | 次数 | 次数 | 次数 | 次数 | 次数 | 次数 | 次数 | 次数 |
---|---|---|---|---|---|---|---|---|---|
L1 | L2 | L2 | L3 | L3 | L3 | L1 | L2 | L2 | L2 |
R0 | R0 | R1 | R1 | R2 | R3 | R0 | R0 | R1 | R2 |
( | ( | ) | ( | ) | ) | ( | ( | ) | ) |
当 Lx = Rx 的时候,L1 为最外层的 “(” ,Rx 为最外层的 “)”
题解 JAVA 实现
public String removeOuterParentheses(String S) {
char[] charArray = S.toCharArray();
int leftCount = 0;
int rightCount = 0;
StringBuilder result = new StringBuilder();
for (char c : charArray) {
if (c == '(') {
leftCount++;
} else {
rightCount++;
}
if (leftCount == rightCount) {
leftCount = 0;
rightCount = 0;
} else {
if (leftCount != 1) {
result.append(c);
}
}
}
return result.toString();
}