leetcode1021. 删除最外层的括号

97 阅读2分钟

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

前言

继续学习栈与队列有关知识,今天做了一道简单题,简单总结下。

题目

对 s 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 s 。

理解

看题目描述了那么多原语,其实原语的概念十分简单——就是不能再拆分成两个有效括号字符串 A + B的。通俗来说就是不可再切分成有效括号字符串的,例如:"()","(())","(()()())"就是原语,但是"()()","()(())"不是原语。题目要求我们去除每个原语最外面一层括号。

解题

利用栈的特性解决这个问题并不难:

  1. 从左到右遍历整个字符串
  2. 遇到"("将其入栈
  3. 遇到")"匹配上一个"(",将栈顶元素弹出

注意:最后res返回的字符串需要删除最外层的括号,所以可以判断栈长度为1或0时不存入结果字符串中。

根据上面的思路已经可以解决问题,但是还可以进行优化,减少判断。

可以首先判断当前的字符是否为")",如果是则弹出栈中的元素,由此可以省去判断栈的长度为1,也就是栈中有原语最外层"("的情况。

代码实现

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

后记

事实证明,坚持按分类刷题一段时间是有很大帮助的。在这之前我随便找题刷,碰到同类的题还是没有一点思路。但是分类刷题后,我知道这个题需要用到栈的相关知识,有了比较明确的思路。虽然是道简单题,但是还是给了我很大信心坚持下去。