有效括号字符串为空 ""、"(" + 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:
输入:s = "(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。
示例 2:
输入:s = "(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每个部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。
示例 3:
输入:s = "()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。
这道题写起来不难,重点在怎么确定什么是最外面的括号,首先我们先定义一个isOut,初始化为false,由于该题是有效括号字符串,所以只要字符串有值,那么第一个必然是"(",并且必然有与之对应的")",如果isOut是false,那么遇到的第一个"(",我们将isOut设置为true,而内部的括号我们用res数组保存,如果遇到"(",加入到数组中,并且对str中填入此时元素,如果遇到")",我们取出数组中的最后一个元素,并且对str中填入此时元素。直到当遇到时数组为空,这时的")"是与开始的"("对应的,此时我再将isOut设置为false,直到s遍历结束。返回str
var removeOuterParentheses = function (s) {
let str = "";
let res = [];
let isFirst = false;
for (let i = 0; i < s.length; i++) {
if (res.length == 0 && !isFirst && s[i] == "(") {
isFirst = true;
} else if (res.length == 0 && isFirst && s[i] == ")") {
isFirst = false
} else
if (s[i] == "(") {
str += "(";
res.push(s[i])
} else if (s[i] == ")") {
str += ")";
res.pop()
}
}
return str;
};