leetcode-301. 删除无效的括号
题目描述
给你一个由若干括号和字母组成的字符串 s
,删除最小数量的无效括号,使得输入的字符串有效。
返回所有可能的结果。答案可以按 任意顺序 返回。
示例 1:
输入:s = "()())()" 输出:["(())()","()()()"]
示例 2:
输入:s = "(a)())()" 输出:["(a())()","(a)()()"]
示例 3:
输入:s = ")(" 输出:[""]
思路
回溯+剪枝,参考:. - 力扣(LeetCode)代码使用的是官方第一种解法
1)先遍历字符串,分别找到左,右括号的异常个数
2)写一个函数,用来判断当前字符串是否是有效的括号
3)回溯,先写终止条件;两次的剪枝操作;左,右括号的回溯
ps:加入start变量,是为了每次不重复从索引0开始运行,而是按索引顺序往下回溯
class Solution(object):
# 判断是否为有效括号
def isvalid(self, s):
cnt = 0
for i in s:
if i=='(':
cnt+=1
elif i==')':
cnt-=1
if cnt<0:
return False
return cnt == 0
# 回溯
def huisu(self, s,left_remove,right_remove,res,start):
if left_remove==0 and right_remove==0:
if self.isvalid(s):
res.append(s)
return
for i in range(start, len(s)):
if i>0 and s[i]==s[i-1]:
continue
if left_remove+right_remove > len(s)-i:
break
if left_remove>0 and s[i]=='(':
self.huisu(s[:i]+s[i+1:],left_remove-1,right_remove,res,i)
if right_remove>0 and s[i]==')':
self.huisu(s[:i]+s[i+1:],left_remove,right_remove-1,res,i)
def removeInvalidParentheses(self, s):
"""
:type s: str
:rtype: List[str]
"""
# 找到异常的左右括号数
res = []
left_remove = 0
right_remove = 0
for i in s:
if i == '(':
left_remove+=1
elif i == ')':
if left_remove==0:
right_remove+=1
else:
left_remove-=1
# 加入start变量,是为了每次不重复从索引0开始运行,而是按索引顺序往下回溯
self.huisu(s,left_remove,right_remove,res,0)
return res
if __name__ == '__main__':
s = Solution()
# ss = "()())()"
# ss=')('
ss = ")(f"
print(s.removeInvalidParentheses(ss))