括号生成

30 阅读1分钟

括号生成

错误思路:就是给定 n 对括号字符,求其所有排列组合中有效的组合

第一个元素跟最后一个元素肯定是()

可以用栈的思想,但是怎么操作

思路:回溯法

  1. 递归函数定义: 使用递归函数 generate 来生成括号,该函数可以接受当前括号字符串 current、已经使用的左括号数 open 和已经使用的右括号数 close,以及括号对数 n。
  2. 递归终止条件: 当 current 字符串的长度达到 2 * n 时(因为每一对括号由两个字符组成),将 current 添加到结果列表中。
  3. 递归逻辑
    • 添加左括号:只要左括号数目 open 小于 n,就可以添加一个左括号。
    • 添加右括号:只要右括号数目 close 小于左括号数目 open,就可以添加一个右括号。这确保了生成的序列一定是有效的。

每当递归调用返回后,它回到了之前的状态(上一个递归层级)。此时,会尝试其他可能的括号添加,例如在尝试添加左括号后返回,会接着尝试添加右括号(如果条件允许)。 所以,这个函数可以探索所有的可能性。

func generateParenthesis(n int) []string {
	var result []string
	generate(&result, "", 0, 0, n)
	return result
}

func generate(result *[]string, str string, left, right, n int) {
	if len(str) == 2*n {
		*result = append(*result, str)
		return
	}
	if left < n {
		generate(result, str+"(", left+1, right, n)
	}
	if right < left {
		generate(result, str+")", left, right+1, n)
	}
}