leetcode-栈-[1021] 删除最外层的括号

有效括号字符串为空 ("")"(" + A + ")"A + B,其中 AB 都是有效的括号字符串,+ 代表字符串的连接。例如,"""()""(())()""(()(()))" 都是有效的括号字符串。
如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 AB 都是非空有效括号字符串。
给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。
S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S

示例 1:

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

示例 2:

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

示例 3:

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


提示:

  1. S.length <= 10000
  2. S[i]"("")"
  3. S 是一个有效括号字符串

解题思路

  1. 申明一个数组缓存符号
  2. 申明一个变量对出现的 "(" 进行统计
  3. 对字符串进行循环
  4. 判断字符类型,如果出现 "(" 进行count++,count>1表示从第二个"(" 开始 ,如果出现 ")" 进行count—,count>0表示还有待匹配的 "(" 即count=0时表示当前的 ")" 为最外层
  5. 将arr数组转换成字符串输出
  1. /**
  2. * @param {string} S
  3. * @return {string}
  4. */
  5. var removeOuterParentheses = function (S) {
  6. var arr = [];
  7. var count = 0;
  8. for (const i of S) {
  9. if (i === '(') {
  10. count++;
  11. if (count > 1) {
  12. arr.push(i);
  13. }
  14. } else {
  15. count--;
  16. if (count > 0) {
  17. arr.push(i);
  18. }
  19. }
  20. }
  21. return arr.join('');
  22. };