这个题我们考虑用bfs的方法来解决。如何做呢?我们做bfs,上一层level和下一层level之间的关系为:把所有上一层level中的每个元素都拿出来,列举出再删除一个括号后的所有可能情况。(不管删除后是否合法),添加到下一个level中。例如:现在的level是[”())”, “())”],那么下一层level的元素应该是:1. 对“())”删除一个括号的所有可能为:(),(),((。 2. 对”())”删除一个括号的所有可能为:(),)),()。这六个就是下一个level的全部内容了。但是我们也会发现,就是有重复元素出现的情况,那么我们可以将level中的list换成set就能避免这个重复的发生。至于我们如何检查某个序列是否是一个合法的括号序列,可以维护一个计数器或者用栈的方法实现。另外一个小技巧是,用filter(func, param)函数可以得到param中所有符合条件的元素。其中的判定方法根据func返回的True or False 来决定。
这个算法的时间复杂度是O(2^N),因为在最坏的情况下,表达式中只有左括号,对于每个括号,我们都有两个选项即是删除它还是考虑它。空间复杂度是O(N)。
python:
class Solution:
def removeInvalidParentheses(self, s: str) -> List[str]:
def isValid(seq):
cnt = 0
for c in seq:
if c == "(":
cnt += 1
elif c == ")":
cnt -= 1
if cnt < 0:
return False # 一旦中途cnt小于0,就要终止循环,已经出现非法字符(即多余的“)”)
return cnt == 0
level = {s}
while True:
valid = list(filter(isValid, level))
if valid: # 如果当前valid是非空的,说明已经有合法的产生了。
return valid
next_level = set()
for item in level:
for i in range(len(item)):
if item[i] in "()":
next_level.add(item[:i]+item[i+1:])
level = next_level
PREVIOUSlc301.删除无效的括号
NEXTlc127.单词接龙