LeetCode 1021.删除最外层的括号

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1021.删除最外层的括号相关的知识,希望对你有一定的参考价值。

【LetMeFly】1021.删除最外层的括号

力扣题目链接:https://leetcode.cn/problems/remove-outermost-parentheses/

有效括号字符串为空 """(" + A + ")"A + B,其中 AB都是有效的括号字符串,+代表字符串的连接。

例如,"""()""(())()""(()(()))"都是有效的括号字符串。
如果有效字符串 s非空,且不存在将其拆分为 s = A + B的方法,我们称其为原语(primitive),其中 AB都是非空有效括号字符串。

给出一个非空有效字符串 s,考虑将其进行原语化分解,使得:s = P_1 + P_2 + ... + P_k,其中 P_i是有效括号字符串原语。

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 ≤ s . l e n g t h ≤ 1 0 5 1\\leq s.length\\leq 10^5 1s.length105
  • s[i]‘(’‘)’
  • s s s 是一个有效阔和字符串

题目大意

题目大概意思就是要把原字符串拆分成(...)(...)(...)的样子。

例如某个字符串可以拆分成(a)(b)(c)(d),那么就返回abcd

其中,我们把(a)(b)(c)(d)记为原语

也就是说要把由原语组成的字符串拆分成每个原语,然后把每个原语去掉两边的括号并按顺序拼接后返回。

思路

用变量 l e f t left left来记录未配对的左括号的数量。

从左到右遍历字符串,遇到左括号 l e f t left left + 1 +1 +1,遇到右括号就 − 1 -1 1

方法一:模拟

遇到括号,如果计数之前 l e f t left left 0 0 0,那么就说明这是一个原语的****开始。原语的最括号是不用作为答案返回的,因此只有当 l e f t left left不为 0 0 0的时候才返回当前字符。

遇到括号,如果计数之后 l e f t left left 0 0 0,那么就说明这是一个原语结束。原语的最括号是不用作为答案返回的,因此只有当 l e f t left left不为 0 0 0的时候才返回当前字符。

  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++

// 原语(primitive)
class Solution 
public:
    string removeOuterParentheses(string s) 
        string ans;
        int left = 0;  // 当前有几个未配对的左括号
        for (char& c : s) 
            if (c == '(') 
                if (left) 
                    ans += '(';
                
                left++;
            
            else 
                left--;
                if (left) 
                    ans += ')';
                
            
        
        return ans;
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125015777

开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于LeetCode 1021.删除最外层的括号的主要内容,如果未能解决你的问题,请参考以下文章

算法1021. 删除最外层的括号(多语言实现)

算法1021. 删除最外层的括号(多语言实现)

LeetCode 面试题 17.11. 单词距离 / 1021. 删除最外层的括号 / 468. 验证IP地址

LeetCode.1021-删除最外面的括号(Remove Outermost Parentheses)

LeetCode 11 删除最外层的括号[栈] HERODING的LeetCode之路

LeetCode刷题(142)~ 删除最外层的括号栈|双指针