首先,检查一个string是否为valid parentheses,需要用栈的形式,扫描string:
1.遇到'(',入栈
2.遇到')',如果栈为空,返回invalid; 否则从栈顶pop出一个元素
扫描完毕,只有当栈为空时,才返回valid。
而这道题需要用到递归的方式进行求解,使用brutal force方式显然会超时,因此需要两个方法进行优化。
方法一:扫描string
1.遇到'('时,说明左侧需要有一个')'与其匹配,因此令left += 1
2.遇到')'时,先检查left是否大于0,如果left>0,令left -= 1,表示与左侧一个'('进行了匹配;否则令right += 1
扫描完毕后,left, right数量即需要从string删除的'(', ')'的最小数量。
方法二:递归时,为了避免重复,记录一个pre_index,表示删除时必须从pre_index之后的数开始
class Solution(object):
def valid(self, s):
left = 0
for ss in s:
if ss == '(':
left += 1
elif ss == ')':
if left <= 0:
return False
left -= 1
return left == 0
# pre表示删除时从index = pre开始,避免重复
def sub(self, s, left, right, pre):
if left == 0 and right == 0:
if self.valid(s):
self.result[s] = 1
return
if left > 0:
for i in range(pre, len(s)):
if s[i] == '(':
self.sub(s[:i] + s[i+1:], left - 1, right, i)
if right > 0:
for i in range(pre, len(s)):
if s[i] == ')':
self.sub(s[:i] + s[i+1:], left, right - 1, i)
def removeInvalidParentheses(self, s):
"""
:type s: str
:rtype: List[str]
"""
left = 0
right = 0
for ss in s:
if ss == '(':
left += 1
elif ss == ')':
if left > 0:
left -= 1
else:
right += 1
print(left, right)
self.result = {}
self.sub(s, left, right, 0)
return self.result.keys()