反转每对括号间的子串

问题描述

给出一个字符串 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"

说明:

0 <= s.length <= 2000

s 中只有小写英文字母和括号

我们确保所有括号都是成对出现的

输入说明

输入仅含有小写英文字母和括号的字符串

输出说明

输出一行,表示结果

输入范例

(u(love)i)

输出范例

iloveu
 

实现思路

用string接收输入的数据,依次遍历该字符串,若不是 ')' 则将字符入栈,否则出栈,一直出到字符为 '(' ,并在出栈的时候将字符存入vector定义的结构里,由于栈的特性是后进先出,所以在出栈进vector的时候就已经完成了反转,然后将反转后的数据再次压入原来的栈里。最后栈中的元素就是已经反转过的,但还是因为栈的先进后出的特性,此时需要再次反转才能输出最终结果。

实现代码
#include<iostream>

#include<stack>

#include<string>

#include<algorithm>

#include<vector>

using namespace std;



int main()

{

    stack<char> s;

    string str;
    cin>>str;

    for(int i = 0; i<str.size(); i++)
    {
        if(str[i]==')')
        {
            vector<char> s_rev;//用来反转
            //进行反转: 由于栈的特性是先进后出,所以在出栈并进入s_rev的时候就已经完成了反转
            while(s.top()!='(')
            {
                s_rev.push_back(s.top());
                s.pop();
            }
            s.pop();//弹出 '('


            //将反转后的元素重新进栈
            for(int j = 0; j<s_rev.size(); j++)
            {
                s.push(s_rev[j]);
            }

        }
        else
        {
            s.push(str[i]);
        }
    }

    //最后栈中元素便是反转后的字符串,但要再反转一次得到最终结果
    //因为比如原始字符串为(u(love)i),那么处理结束后栈中存储的结果为iloveu,但由于栈是先进后出,所以要再反转一次才能得到最终答案


    vector<char> res;
    while(!s.empty())
    {
        res.push_back(s.top());
        cout<<s.top();
        s.pop();
    }

    reverse(res.begin(),res.end());

    for(int i = 0;i<res.size();i++){
        cout << res[i];
    }

    cout<<endl;


    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值