题目来源:LintCode
问题描述:你将得到一个由小写字母 a-z ,左括号 ‘(’ 和右括号 ‘)’ 构成的字符串 s。
你的任务是删除尽可能少的括号,使得 s 里面的括号匹配。
你需要返回删除括号后的字符串。
由于答案可能会有很多,所以你只需要返回任意一个正确答案。
例如:"()", “(())”, “()()”, “(())()” 是括号匹配的字符串, 而 “)(”, “(()”, “()()(”, “()())” 则是括号不匹配的字符串。
输入样例:
输入:
string = ")a(b(c(de)fgh)))(("
输出:
"a(b(cde)fgh)"
题目分析:
采用循环遍历字符串,当遍历到"(“时,将其压入栈中保存;当遍历到”)“时,先判断栈是否为空,如果栈空,则删除此时的”)",若栈不为空,再判断栈顶元素是否为"(",如果是,则将"(“出栈,如果不是,则将”)“删除。遍历完整个字符串后查看栈中的元素,若栈空恰好满足情况,若栈中有元素,那么有多少个元素就需要在原字符串中删除多少个(例如:遍历完后栈中还有两个”(",说明原字符串中还有2个"("是多余的)。注意:最后删除时需要从右开始删除,否则会打破已经匹配好的括号。(可以先将字符串反转,然后用replace方法用空字符进行替换,起到删除的效果)
Python实现:
def bracketmatch(string):
stack = [] #新建一个列表充当栈
for s in string:
if s == "(":
stack.append(s) # 对"("进行压栈
elif s == ")":
if stack == []:
string = string.replace(')', '', 1) # 判断栈空,删除")"
elif stack[-1] == '(':
stack.pop() # 判断栈非空,将"("出栈
if stack: # 遍历完所有字符后栈非空
string = string[::-1] # 反转字符串
string = string.replace('(', '', len(stack)) # 删除多余"("
string = string[::-1] # 还原字符串
return string
结语:
第一次创作,入门级小白一枚,有不对的地方欢迎各位大佬指出。