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;
}
};