移除最外层的括号
移除最外层的括号
给定一个有效的括号字符串S
,移除字符串中最外层的括号,返回新的字符串。
示例:
输入:S = "(()())(())" 输出:"()()()" 解释:最外层的括号被移除,得到新的字符串为"()()()"。
输入:S = "(()())(())(()(()))" 输出:"()()()()(())" 解释:最外层的括号被移除,得到新的字符串为"()()()()(())"。
题目分析与解题步骤:
这个问题可以使用栈来解决。我们可以遍历字符串中的每个字符,然后使用一个栈来模拟括号的匹配过程。对于每个字符,如果它是左括号且栈为空,说明它是最外层的左括号,我们将其标记为不需要保留。否则,我们将其入栈,表示保留该括号。当遇到右括号时,我们将栈顶的左括号出栈,表示匹配成功。最后,将栈中剩余的括号组合成新的字符串即为最终结果。
解题步骤如下:
创建一个栈
stack
,用于模拟括号的匹配过程。创建一个空字符串
result
,用于保存最终结果。遍历字符串
S
中的每个字符,并执行以下操作:如果当前字符是左括号且栈为空,说明它是最外层的左括号,不需要保留。
如果当前字符是左括号,将其入栈。
如果当前字符是右括号,将栈顶的左括号出栈,表示匹配成功。
如果出栈后,栈为空,说明这是最外层的右括号,不需要保留。
如果出栈后,栈不为空,将出栈的左括号和右括号添加到结果字符串
result
中。
返回结果字符串
result
作为最终的解答。
JavaScript解题框架:
function removeOuterParentheses(S) {
let stack = new Stack();
let result = '';
for (let char of S) {
if (char === '(' && stack.isEmpty()) {
continue;
}
if (char === '(') {
stack.push(char);
}
if (char === ')' && stack.peek() === '(') {
stack.pop();
if (!stack.isEmpty()) {
result += '(' + char + ')';
}
}
}
return result;
}
在这个框架中,我们首先定义了一个栈类Stack
,其中包含了常用的栈操作方法。然后,我们使用栈来移除最外层的括号。
在removeOuterParentheses
函数中,我们遍历字符串S
,并使用栈来模拟括号的匹配过程。对于每个字符,我们根据括号的类型和栈的状态进行判断和操作,以移除最外层的括号。
最后,将栈中剩余的括号组合成新的字符串,并返回最终结果。