LeetCode301:回溯中的枚举
发布日期:2021-05-07 14:08:13 浏览次数:21 分类:精选文章

本文共 1717 字,大约阅读时间需要 5 分钟。

为了解决删除最小数量的无效括号并返回所有可能结果的问题,我们可以使用深度优先搜索(DFS)来探索所有可能的删除组合。以下是详细的解决方案:

方法思路

  • 统计括号数量:首先遍历字符串,统计左括号和右括号的数量。
  • 深度优先搜索(DFS):使用递归的方式处理每个字符,尝试删除或保留括号,并记录当前的状态(剩余的左括号和右括号数量)。
  • 剪枝优化:在递归过程中记录已经处理过的状态,避免重复计算,提高效率。
  • 收集结果:每当找到一个有效的括号序列时,将其添加到结果集合中。
  • 这种方法确保了我们能够探索所有可能的删除组合,并找到所有有效的括号序列。

    解决代码

    class Solution:
    def removeInvalidParentheses(self, s: str) -> List[str]:
    n = len(s)
    left_count = 0
    right_count = 0
    for c in s:
    if c == '(':
    left_count += 1
    elif c == ')':
    right_count += 1
    result = set()
    def dfs(index, left, right, current, visited):
    state = (left, right)
    if state in visited:
    return
    visited.add(state)
    if index == n:
    if left == 0 and right == 0:
    result.add(current)
    return
    c = s[index]
    if c == '(':
    if left > 0:
    dfs(index + 1, left - 1, right, current + c, visited)
    dfs(index + 1, left, right, current, visited)
    elif c == ')':
    if right > 0:
    dfs(index + 1, left, right - 1, current + c, visited)
    dfs(index + 1, left, right, current, visited)
    else:
    dfs(index + 1, left, right, current + c, visited)
    dfs(0, left_count, right_count, "", set())
    return list(result)

    代码解释

  • 统计括号数量:遍历字符串,统计左括号和右括号的数量。
  • DFS函数:定义一个递归函数dfs,处理当前字符,尝试保留或删除括号,并递归处理下一个字符。
  • 剪枝优化:使用visited集合记录已处理过的状态,避免重复计算。
  • 收集结果:当递归结束时,检查是否形成了一个有效的括号序列,如果是,将其添加到结果集合中。
  • 返回结果:将结果集合转换为列表返回。
  • 这种方法确保了我们能够高效地找到所有可能的有效括号序列,并返回它们。

    上一篇:AcWing 785:快速排序
    下一篇:LeetCode:37(解数独):在二维数组中的逐步回溯:一般思维+进阶思维

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月07日 08时45分56秒