给出一个字符串 s(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。
注意,您的结果中 不应 包含任何括号。
示例 1:
输入:s = "(abcd)"
输出:"dcba"
示例 2:输入:s = "(u(love)i)"
输出:"iloveu"
解释:先反转子字符串 "love" ,然后反转整个字符串。
示例 3:输入:s = "(ed(et(oc))el)"
输出:"leetcode"
解释:先反转子字符串 "oc" ,接着反转 "etco" ,然后反转整个字符串。
示例 4:输入:s = "a(bcdefghijkl(mno)p)q"
输出:"apmnolkjihgfedcbq"
实现思路:
首先本题使用栈实现,栈中存储的为string类型的变量。
变量解释:
- 定义一个栈stack<string>,在遍历过程中存储str
- 定义一个string类型的变量str,用来保存最终的结果
实现
遍历s的每一个元素,没有遇到括号时,用str累加字符将字符保存在str中,
遇到左括号时,将字符串str保存的字符串入栈,同时将str置为空,用来保存临近左括号后面的字符串。
如果遇到右括号,说明遇到了最内层的内容,此时将str保存的内容进行翻转,同时将栈顶元素累加到str中,注意在累加过程中,是将栈顶元素+str的内容,不可以反过来,同时栈顶元素出栈。
直到遍历完成,str存储的就是最终的答案,最后返回str
代码实现:
class Solution {
public:
string reverseParentheses(string s) {
std::stack<string> stk;//定义栈
std::string str;//定义保存结果的str
int len=s.length();//s的长度
for (int i=0;i<len;i++) {
if (s[i] == '(') {
stk.push(str);
str = "";
} else if (s[i] == ')') {
reverse(str.begin(), str.end());
str = stk.top() + str;
stk.pop();
} else {
str+=s[i];
}
}
return str;
}
};