题目:​​原题链接​​(困难)

标签:深度优先搜索、广度优先搜索、字符串

解法

时间复杂度

空间复杂度

执行用时

Ans 1 (Python)

LeetCode题解(0301):删除无效的括号(Python)_python

LeetCode题解(0301):删除无效的括号(Python)_python

72ms (79.18%)

Ans 2 (Python)

Ans 3 (Python)

解法一:

class Solution:
def removeInvalidParentheses(self, s: str) -> List[str]:
# 移除左右多余的括号
s = s.lstrip(")").rstrip("(")
size = len(s)

# 统计必须删除的左括号数量
delete_left_num = delete_right_num = 0
for ch in s:
if ch == "(":
delete_left_num += 1
elif ch == ")":
delete_left_num = max(delete_left_num - 1, 0)
for ch in s[::-1]:
if ch == ")":
delete_right_num += 1
elif ch == "(":
delete_right_num = max(delete_right_num - 1, 0)
# print(s, ":", delete_left_num, delete_right_num)

# 深度优先搜索
ans = set()

def dfs(i, ss, now, delete_left, delete_right):
# 处理已经寻找到字符串末尾的情况
if i == size:
if now == 0:
ans.add(ss)

# 处理尚未寻找到字符串末尾的情况
else:
if s[i] == "(":
if now == 0:
dfs(i + 1, ss + "(", 1, delete_left, delete_right)
if delete_left < delete_left_num:
dfs(i + 1, ss, now, delete_left + 1, delete_right)
elif now > 0:
dfs(i + 1, ss + "(", now + 1, delete_left, delete_right)
if delete_left < delete_left_num:
dfs(i + 1, ss, now, delete_left + 1, delete_right)
else:
return
elif s[i] == ")":
if now == 0:
if delete_right < delete_right_num:
dfs(i + 1, ss, now, delete_left, delete_right + 1)
elif now > 0:
dfs(i + 1, ss + ")", now - 1, delete_left, delete_right)
if delete_right < delete_right_num:
dfs(i + 1, ss, now, delete_left, delete_right + 1)
else:
return
else:
dfs(i + 1, ss + s[i], now, delete_left, delete_right)

dfs(0, "", 0, 0, 0)

return list(ans)