[路飞]_前端算法第四十一弹-1021. 删除最外层的括号

146 阅读2分钟

有效括号字符串为空 """(" + A + ")"A + B ,其中 AB 都是有效的括号字符串,+ 代表字符串的连接。

  • 例如,"""()""(())()""(()(()))" 都是有效的括号字符串。

如果有效字符串 s 非空,且不存在将其拆分为 s = A + B 的方法,我们称其为原语(primitive),其中 AB 都是非空有效括号字符串。

给出一个非空有效字符串 s,考虑将其进行原语化分解,使得:s = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。

s 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 s

示例 1:

输入:s = "(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。

示例 2:

输入:s = "(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每个部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。

示例 3:

输入:s = "()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""

这道题写起来不难,重点在怎么确定什么是最外面的括号,首先我们先定义一个isOut,初始化为false,由于该题是有效括号字符串,所以只要字符串有值,那么第一个必然是"(",并且必然有与之对应的")",如果isOutfalse,那么遇到的第一个"(",我们将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;
};