删除最外层的括号
有效括号字符串为空 ""、"(" + 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 = "()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。
提示:
- 1 <= s.length <= 105
- s[i] 为 '(' 或 ')'
- s 是一个有效括号字符串
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
PS
就是给我们一串左括号和右括号组成的字符串,左括号的数量等于右括号,删除最外层的左括号和右括号
思路
遍历数组,第一个遇到的左括号和最后一个遇到的右括号都删掉即可,但是有可能有()()这个情况,所以我们需要创建一个变量,用来记录遇到左括号的个数和右括号的个数
遇到左括号,判断变量是否>0,为0则代表这是第一个遇到的左括号,不要,反之进行字符串拼接,变量++
遇到右括号,判断变量是否>1,变量为1代表这是最外层的右括号,不要,反之进行字符串拼接,变量--
代码
var removeOuterParentheses = function (s) {
// 定义一个字符串储存输出的字符串
// 定义一个number判断进来的'('和')'
let res = '',
opened = 0;
// for循环字符串
for (ch of s) {
if (ch === '(') {
// 当进来左括号时,opened++,第一个左括号不要
// 所以opened>0的时候,才与res拼接
if (opened > 0) res += ch;
opened++;
} else {
// 最后一个右括号不要,所以进来右括号时,opened==1的时候不与res拼接
if (opened > 1) res += ch;
opened--;
}
}
return res;
};