返回

让你成为括号生成大师:玩转 leetcode-22

前端

导言

在计算机科学的广阔世界中,算法和数据结构是解决复杂问题的基石。在众多算法挑战中,LeetCode 22:括号生成脱颖而出,它考验着程序员对递归和回溯算法的理解。在这篇文章中,我们将深入探讨这个经典问题,并提供一个分步指南,帮助你掌握生成有效括号组合的奥秘。

问题陈述

给定一个整数 n,它表示要生成的左括号和右括号的对数。你的任务是编写一个函数,生成所有可能的、有效的括号组合。

什么是有效括号组合?

一个有效的括号组合必须满足以下条件:

  • 每个左括号都必须有一个匹配的右括号。
  • 每个右括号都必须有一个匹配的左括号。
  • 括号不能交叉或重叠。

解决方案:递归和回溯

解决 leetcode-22 的最佳方法是利用递归和回溯算法。递归函数自身调用自身,每次调用时都缩小问题的规模。回溯则允许函数在穷举所有可能性时回退到之前的状态。

以下是使用递归和回溯解决该问题的步骤:

  1. 初始化 :创建一个空字符串和两个计数器,一个用于左括号,一个用于右括号。
  2. 递归函数 :创建一个递归函数,它接受当前字符串、左括号和右括号的计数器作为参数。
  3. 递归基本情况 :如果左括号和右括号的计数器都为 0,则该组合有效。将其添加到结果列表中并返回。
  4. 如果可以添加左括号 :如果左括号计数器小于 n,则将左括号添加到当前字符串并递增左括号计数器。递归调用函数以继续生成有效组合。
  5. 如果可以添加右括号 :如果右括号计数器小于左括号计数器,则将右括号添加到当前字符串并递减右括号计数器。递归调用函数以继续生成有效组合。
  6. 回溯 :在每次递归调用后,回溯到上一个状态,移除最后一个字符并更新计数器。

代码实现

以下 Python 代码展示了如何使用递归和回溯解决 leetcode-22:

def generateParenthesis(n):
  result = []

  def backtrack(current_string, left, right):
    if left == 0 and right == 0:
      result.append(current_string)
      return

    if left > 0:
      backtrack(current_string + '(', left - 1, right)

    if right > 0 and right > left:
      backtrack(current_string + ')', left, right - 1)

  backtrack('', n, n)
  return result

示例用法

combinations = generateParenthesis(3)
print(combinations)

输出

['((()))', '(()())', '(())()', '()(())', '()()()']

结论

解决 leetcode-22:括号生成是一个极好的方式,可以提高你对递归和回溯算法的理解。通过仔细分析问题并利用适当的算法,你可以成功生成所有可能的、有效的括号组合。掌握这些算法技术将使你能够解决一系列复杂的问题,并提升你的编程技能。