给出一个字符串 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
中只有小写英文字母和括号- 我们确保所有括号都是成对出现的
这题可能和词法分析有关(编译原理没学好系列)
直接上码了 懒得解释了。。。这题我超时了 未能提交 rank分要下降了。。
class Solution {
public:
string reverseParentheses(string s)
{
stack<string> ss;
for (int i = 0; i < s.size(); ++i)
{
if (s[i] == '(')//在任何情况(都要被直接丢弃
{
if (s[0] == '(')//((的情况,塞个空串
{
ss.push("");
s.erase(s.begin());
i = -1;
}
else if (s[i + 1] == ')')//()的情况,丢弃
{
s.erase(s.begin() + i);
s.erase(s.begin() + i);
i--;
}
else//正常情况,塞到栈里
{
ss.push(s.substr(0, i));
s.erase(0, i + 1);
i = -1;
}
}
else if (s[i] == ')')//弹出,如果报错就说明有问题
{
reverse(s.begin(), s.begin() + i);//先逆序
s.erase(s.begin() + i);//删除(
s = ss.top() + s;//,弹出的在前
ss.pop();
i = -1;//计数清空
}
}
return s;
}
};