leetcode —— 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:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-outermost-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————————
解题思路:题目意思是将一个有效字符串分割成若干有效字符串,并将每个子有效字符串的最外层括号删除,使用栈的思想,统计左括号和右括号的个数进行判断。

其Python代码如下:

class Solution:
    def __init__(self):
        self.ans = []
    def removeOuterParentheses(self, S: str) -> str:
        length = len(S)
        
        index = 0  # 用于记录当前子有效字符串的起始位置
        nums = 0  # 用于记录当前子有效字符串的左括号数量
        for n in range(length):
            # 当前符号为左括号
            if S[n] == "(":
                nums += 1
            # 当前括号为右括号,同时多余的左括号只有一个    
            elif nums== 1:
                # 此有效字符串的长度为2,则直接抛弃
                if n-index+1==2:
                    index = n+1  # 更新起始位置
                    nums = 0  # 更新左括号的数量
                    continue
                # 此有效字符串的长度大于2    
                else:
                    # 将此有效字符串放进列表中保存
                    self.ans.append(S[index+1:n])
                    index = n+1  # 更新起始位置
                    nums = 0  # 更新左括号数量
                    continue
            # 当前括号为右括号,多余的左括号大于一个        
            else:
                nums -= 1
        return "".join(self.ans)  # 将列表中的字符串进行合并并返回,使用join比+更快

其C++代码如下:

class Solution {
public:
    string removeOuterParentheses(string S) 
    {
        string ans = "";
        int length = S.size();
        int index = 0;
        int nums = 0;
        for(int i=0;i<length;++i)
        {
            if(S[i]=='(')
            {
                nums += 1;
            }
            else if(nums==1)
            {
                ans += S.substr(index+1,i-index-1);
                index = i+1;
                nums = 0;
            }
            else
            {
                nums -= 1;
            }
        }
        return ans;
    }
};

代码的实际复杂度为O(n),n为字符串的长度;空间复杂度为O(n);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值