LeetCode刷题,删除最外层括号(1021)

222 阅读1分钟

删除最外层括号

给你一个字符串括号,返回删除对其进行原语化分解的最外层括号的字符串。 例子:s = "(()())(())" 原语化分解-> (()()) + (()) 再分别去除最外层 -> ()() + ()。

解题代码

思路:原语(独立的括号序列)说明左括号和右括号相减的差值为0。如以下示范

  1. (  (  )  (  )  )  (  (  )  )
  2. 1 2 1 2 1 0 1 2 1 0
  3. 由此可得,我们只需要记录括号字符串中每个位置为0的下标进行截取即可
var removeOuterParentheses = function(s) {
  let cnt = 0; // 记录括号差值
  let pre = 0; // 记录每段区间的起始位置
  let res = ""; // 记录结果字符串
  for (let i = 0; i < s.length; i++) {
    if (s[i] === "(") cnt += 1; //左括号加1
    else cnt -= 1; // 右括号-1
    if (cnt !== 0) continue; // 如果差值不为0说明还不是单独的括号位置,直接进行下一次循环
    res += s.substr(pre + 1, i - pre - 1); // 出现0的位置的时候,截取pre到当前i减pre的个数,pre + 1 & pre - 1 是因为我们还需要去除最外层括号
    pre = i + 1; // 区间起始位置进行移动
  }
  return res;
};