删除最外层的括号

作者: 不得不爱XIN | 来源:发表于2019-06-04 17:49 被阅读2次

题目 简单

有效括号字符串为空 ("")、"(" + 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:
输入:"(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。

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

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

解题思路

用一个整形标记即可,左括号出现 +1,如果值大于 1 表示为内部左括号,拼接到返回字符串即可;如果右括号出现则 -1,如果此时的值大于 0 表示为内部右括号,拼接到返回字符串即可。 时间复杂度: O(N),N 为字符串的长度。

CODE

/**
 * @param {string} S
 * @return {string}
 */
var removeOuterParentheses = function (S) {
  const sArray = S.split('');
  var tag = 0;
  var result = '';

  for (index = 0; index < sArray.length; index++) {
    if (sArray[index] === '(') {
      tag ++;
      if (tag > 1) {
        result += sArray[index];
      }
    } else {
      tag --;
      if (tag > 0) {
        result += sArray[index];
      }
    }
  }
  return result;
};

removeOuterParentheses("(()())(())")

这是在我看了leetCode上的解题思路然后写的,下面我记录下我拿到题目后的自己的思路和解法。

用一个标识符记录原语的开始索引,然后用一个数组记录内部左括号的索引,当匹配到右括号就删除数组中的一个左括号索引值(表示匹配了一对括号).当数组为空表示一个原语匹配完成,则记录到结果中。
注意:我这个思路耗时和耗费内存较高,不推荐,只是记录下我的思路😁

/**
 * @param {string} S
 * @return {string}
 */
var removeOuterParentheses = function (S) {
  var sArray = S.split('');
  var primitiveStart = -1;
  var startList = [];
  var result = '';

  for (index = 0; index < sArray.length; index++) {
    if (sArray[index] === '(') {
      if (primitiveStart === -1) {
        primitiveStart = index; //记录原语的开始index
      } else {
        startList.push(index);
      }
    } else {
      let len = startList.length;
      let lastIndex = startList[len - 1];
      if (len <= 0) {
        var result = sArray.slice(primitiveStart, index + 1);
        result += result.slice(1, result.length - 1).join('');
        primitiveStart = -1;
      } else {
        startList.splice(len -1);
      }
    }
  }
  return result;
};

相关文章

网友评论

    本文标题:删除最外层的括号

    本文链接:https://www.haomeiwen.com/subject/cfyrxctx.html