反转每对括号间的子串
问题描述 :
给出一个字符串 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<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<string>
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);
}