反转每对括号间的子串

反转每对括号间的子串

问题描述 :
给出一个字符串 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

#include
#include
#include
#include
#include
using namespace std;
string reverseParentheses(string s) {
     
    stack<char> stack;//放括号 
    vector<int> a;//放对应“(”的指针 
    for(int i=0;i<s.size();i++){
     
        if(!stack.empty()){
     
            if(stack.top()=='('&&s[i]==')'){
     //每碰到一对括号就逆置 
                reverse(s.begin()+a.back()+1,s.begin()+i);                
                stack.pop();
                a.pop_back();
                continue;
                }
            if(s[i]=='('){
     
                stack.push(s[i]);
                a.push_back(i);
                }
            }
            else if(s[i]=='('){
     
                stack.push(s[i]);
                a.push_back(i);
            }
        }
        //去除所有的括号
        for(int i=0;i<s.size();i++){
     
            if(s[i]=='('||s[i]==')'){
     
                s.erase(s.begin()+i);
                i--;
            }         
        }
        return s;
    }
    
int main(){
     
	string s;
	cin>>s;
	cout<<reverseParentheses(s);
}

 

你可能感兴趣的:(栈练习题,栈,stack)