题目:
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目
你将得到一个由小写字母 a-z ,左括号 ‘(’ 和右括号 ‘)’ 构成的字符串 s。
你的任务是删除尽可能少的括号,使得 s 里面的括号匹配。
你需要返回删除括号后的字符串。
由于答案可能会有很多,所以你只需要返回任意一个正确答案。如果答案正确会提示 It is a correct answer.
例如:“()”, “(())”, “()()”, “(())()” 是括号匹配的字符串, 而 “)(”, “(()”, “()()(”, “()())” 则是括号不匹配的字符串。
没有括号的字符串(如:abcd)或空串 “” 也算一个括号匹配的字符串
你只能对原串进行括号删除的操作,其他操作将不被允许。***
样例输入:
s = "a(b(c(de)fgh)"
样例输出:
"a(b(cde)fgh)"
提示:以下是本篇文章正文内容,下面案例可供参考
一、Python数组内置的push,pop是什么?
Push就是把数据压入数组(如果学了c语言就知道 是指向数组的指针前移一位即指针加1)
Pop就是把数据弹出数组(指向数组的指针后移一位即指针减1)
下面可以看看Push Pop是如何实现的
class MinStack(object):
def __init__(self):
self.stack = []
def push(self, x):
self.stack.append(x)
def pop(self):
if self.stack :
self.stack.pop()
def top(self):
if self.stack:
return self.stack[-1]
def getMin(self):
if self.stack:
return min(self.stack)
stack = MinStack()
stack.push(-2)
stack.push(0)
stack.push(-3)
stack.push(5)
stack.push(-4)
print(stack.getMin())
stack.pop()
print(stack.top())
print(stack.getMin())
二、题目解答
1.思路分析
我对于括号删除问题也就是括号匹配问题的升级版(其实大体也是一样的)
首先分析s中括号情况
- s 是正常的左括号先在前,右括号在后,但是左右括号(相不相等无所谓)(),((()),((())))
- s 右括号先在前,左括号在后,)(),)))),
根据分析,我们可以定义两个空数组open_pr和close_pr,open_pr对应的是处理第一种s的情况,close_pr处理的是第二种s的情况
第一种情况我们可以这么处理:
如果遇见左括号,我就push进入open_pr数组,遇见右括号我就从数组open_pr中pop出来
第二种情况的话:
我们可以把遇见左括号前的右括号全部push到数组close_pr中去,然后遇见左括号时就和第一种情况一样,按第一种情况处理
第一种和第二种出来的数组都是多余的不合理的括号
2.代码
代码如下(示例):
class Solution:
def remove_parentheses(self, s: str) -> str:
open_pr, close_pr = [], []
s = list(s)
#这里数组存储的是s字符串中不符合要求的括号的下标 以便后续删除
for index, ch in enumerate(s):
#第一种情况
if ch == '(':
open_pr.append(index)
elif ch == ')' and open_pr:
open_pr.pop()
#第二种情况
elif ch == ')' and not open_pr:
close_pr.append(index)
for index in open_pr + close_pr:
#把不符合的括号全部删除
s[index] = ""
return "".join(s)
Solution().remove_parentheses('a(b(c(de)fgh)')
运行结果
"a(b(cde)fgh)"
总结
要先分清楚s的几种情况 是左括号先出现和右括号先出现两种情况
对两种情况分别处理
第二种情况:右括号先出现可以先记录右括号后按照第一种处理步骤处理