leetcode刷题记录-1021.删除最外层的括号

135 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

前言

今天的题目为简单,主要是要思考如何保存下当前的括号状态,方法有很多,但是思路都是一样的,使用栈的思维,当括号为左括号的时候,入栈,为右括号的时候能够和一个左括号匹配,那么就一个左括号出栈。

每日一题

今天的题目是 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 是一个有效括号字符串

题解

题目需要分解开每一个括号组合,并且提示中又说到了 s 是一个有效的括号字符串,那么我们就能够通过栈的思想来将它分开成为几个完整的括号闭合的字符串,然后再得到了这个字符串之后,只需要将最外层的括号进行删除,内层的括号组合在一起就是我们需要的答案。

优化思路:对于栈来说,唯一的作用就是告诉我们当前的括号字符串是否是完整的,也就是左括号和右括号能一一对应上,我们并不用去关心栈内部的数据,所以说可以不用使用数组来保存栈,只要一个数字代表当前的括号情况就好了,碰到左括号就加一,右括号就减一,这样我们就可以用一个简单的数据记录下当前的括号状态,当这个数字为0的时候就说明当前的括号是能够一一对应上的。

/**
 * @param {string} s
 * @return {string}
 */
var removeOuterParentheses = function(s) {
    let stack = 0
    let res = ''
    let n = s.length
    for(let i =0; i < n-1; i++){
        if(s[i] == ')'){
            stack--
        }
        if(stack){
            res += s[i]
        }
        if(s[i] == '('){
            stack++
        }
    }
    return res
};

image.png