「每日LeetCode」2022年5月28日

本文最后更新于:2023年3月19日 晚上

  1. 删除最外层的括号

1021. 删除最外层的括号

有效括号字符串为空 “”、”(“ + 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 是一个有效括号字符串

思路

按题意模拟即可

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* @param {string} s
* @return {string}
*/
var removeOuterParentheses = function (s) {
let left = 0,
right = 0,
start,
res = "";
for (let i = 0; i < s.length; i++) {
const char = s[i];
if (char === "(") {
if (left === 0) start = i;
left++;
}
if (char === ")") right++;
if (left === right) {
const rest = s.slice(start + 1, i);
res += rest;
left = 0;
right = 0;
start = null;
}
}
return res;
};