【LeetCode】22. 括号生成

leetcode

 

解题思路

生成所有有效的括号组合,核心在于​​回溯算法​​。通过递归逐层构建可能的括号组合,并在过程中通过剪枝策略确保每一步生成的括号序列都满足有效性条件。关键约束条件包括:

  1. ​​左括号数量不超过n​​;
  2. ​​右括号数量不超过左括号数量​​。

关键步骤说明

  1. ​​初始化结果数组​​:用于存储所有有效组合。
  2. ​​回溯递归​​:逐层添加左括号或右括号,满足约束时继续递归。
  3. ​​终止条件​​:当当前字符串长度等于 2n 时,保存结果。
  4. ​​剪枝策略​​:
    • 左括号数不足 n 时,优先添加左括号;
    • 右括号数不足左括号数时,才添加右括号。

复杂度分析

  • ​​时间复杂度​​:O(4ⁿ / √n),由卡特兰数决定,总共有 C(2n, n)/(n+1) 种有效组合。
  • ​​空间复杂度​​:O(n),递归栈深度最大为 2n,结果存储空间与组合数量相关,不计入复杂度。

代码实现

// generateParenthesis 生成所有有效括号组合
func generateParenthesis(n int) []string {
    result := []string{}
    backtrack(&result, "", 0, 0, n)
    return result
}

// backtrack 回溯函数
// result: 结果数组的指针
// current: 当前构建的字符串
// open: 已使用的左括号数
// close: 已使用的右括号数
// max: 目标括号对数 n
func backtrack(result *[]string, current string, open, close, max int) {
    // 终止条件:当前字符串长度达到 2n
    if len(current) == max*2 {
        *result = append(*result, current)
        return
    }

    // 优先添加左括号(若未达到上限)
    if open < max {
        backtrack(result, current+"(", open+1, close, max)
    }

    // 在右括号数不足左括号时,添加右括号
    if close < open {
        backtrack(result, current+")", open, close+1, max)
    }
}

代码注释说明

  1. ​​函数结构​​:

    • generateParenthesis 初始化结果数组并调用回溯函数。
    • backtrack 是核心递归函数,通过参数控制生成逻辑。
  2. ​​剪枝条件​​:

    • open < max:左括号未用完时继续添加,避免数量超过n。
    • close < open:确保右括号数量不超过左括号,维持有效性。
  3. ​​运行示例​​:

    • 输入 n=3 时生成5种组合,与题目要求一致。
    • 输入 n=1 时返回单对括号。
func main() {
    // 示例1:n=3
    fmt.Println(generateParenthesis(3)) // 输出: [((())) (()()) (())() ()(()) ()()()]
    
    // 示例2:n=1
    fmt.Println(generateParenthesis(1)) // 输出: [()]
}

此实现通过深度优先搜索和剪枝策略高效生成所有有效组合,时间复杂度与卡特兰数相关,空间复杂度线性。 

posted @ 2025-04-21 17:23  云隙之间  阅读(41)  评论(0)    收藏  举报