leetcode每日一题5.26

1190. 反转每对括号间的子串

给出一个字符串 s(仅含有小写英文字母和括号)。

请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。

注意,您的结果中 不应 包含任何括号。

示例 1:

输入:s = “(abcd)”
输出:“dcba”
示例 2:

输入:s = “(u(love)i)”
输出:“iloveu”
示例 3:

输入:s = “(ed(et(oc))el)”
输出:“leetcode”
示例 4:

输入:s = “a(bcdefghijkl(mno)p)q”
输出:“apmnolkjihgfedcbq”

此题与leetcode394(leetcode394题解)有点相似
但再遍历字符串中我们只需要考虑三种情况
情况1:左括号
情况2:右括号
情况3:字母
一样我们需要定义一个res的字符串以及x的字符串栈,

当遇到字母时:

 else{
                res=res+s[i];

            }

当遇到左括号时:
当当前res压入栈中,清空res;

      if(s[i]=='(')
            {
               x.push(res);
               res.clear();
            }

当遇到右括号时:
反转当前的res字符串(此时的res为一个括号中的字符串,并将他与x栈顶元素相加)

   else if(s[i]==')')
            {
                  reverse(res.begin(),res.end());
                   res=x.top()+res;
                   x.pop();
            }

例:
s = “ac(ed(et(oc))el)”
结果:“acleetcode”

遍历到第一个括号时:
res=ac;此时将ac压入栈,清空ac:
在这里插入图片描述
遍历到第二个左括号
res=ed;重复上述操作
在这里插入图片描述

遍历到第三个左括号
res=st;重复上诉操作
在这里插入图片描述

遍历到第一个右括号
此时res=oc,将oc反转成‘co’;
与x.top相加;将栈顶元素弹出;
此时res=x.top()+res=etco;
栈为
在这里插入图片描述

遍历到第二个右括号:
此时res为etco,反转得octe;
重复上述操作;
res=edocte;
栈为:
在这里插入图片描述

遍历到第三个右括号:
此时res=edocteel;
将其反转得leetcode;
与ac相加,得acleetcode;
为最终答案

ps:如果一开始遇到的元素就是”(“(不可能为”)“),那么最开始压入的元素为空字符串,如图所示:
在这里插入图片描述
实现代码:

class Solution {
public:
    string reverseParentheses(string s) {
        stack<string> x;
        int n=s.size();
    
        string res;
        for(int i=0;i<n;i++)
        {
            if(s[i]=='(')
            {
               x.push(res);
               res.clear();
            }
            else if(s[i]==')')
            {
                  reverse(res.begin(),res.end());
                   res=x.top()+res;
                   x.pop();
            }
            else{
                res=res+s[i];

            }
        }
           return res;
    }
};
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值