反转没对括号间的字符串
给出一个字符串 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"
思路
- 我们可以用两个栈来做这道题,首先一个栈用来找到“()”,一个栈用来反转
- 如果我们找到“)”,我们将栈顶弹出,进入用来反转的栈,直到碰到“(”。
- 再弹出栈顶,去掉“(”。
- 接着我们再把反转的栈依次弹出栈底(相当于队列),进入第一个栈。
- 遍历所有字符串,最后返回栈的内容
问题
- 在刚开始的时候一直用
while stack and ")" == s[i]
这个会使当stack为空的时候,“)”进栈,进入while stack[-1] != "("
循环中,出现pop了空栈,从而报错。 - 第二个问题是
while stack[-1] != "("
循环中没有考虑到最后要弹出“(”,彻底的把括号去掉。
class Solution:
def reverseParentheses(self, s: str) -> str:
stack = []
temp = []
for i in range(len(s)):
if ")"== s[i]:
while stack[-1]!='(':
temp.append(stack.pop())
stack.pop()
while temp:
stack.append(temp.pop(0))
else:
stack.append(s[i])
return "".join(stack)