leetcode-括号生成-Golang

22. 括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:

输入:n = 1
输出:[“()”]

提示:

1 <= n <= 8

暴力

var result []string

func dfs(cur string, n int) {
	if len(cur) == 2*n {
		if valid(cur) {
			result = append(result, cur)
		}
		return
	}
	cur = cur + "("
	dfs(cur, n)
	cur = cur[:len(cur)-1]
	cur = cur + ")"
	dfs(cur, n)
}

func valid(str string) bool {
	balance := 0
	for i := 0; i < len(str); i++ {
		if str[i] == '(' {
			balance++
		} else {
			balance--
		}
		if balance < 0 {
			return false
		}
	}
	return balance == 0
}

func generateParenthesis(n int) []string {
	result = make([]string,0)
	cur := ""
	dfs(cur, n)
	return result
}

回溯+剪枝

var ans []string

func generateParenthesis(n int) []string {
	ans = make([]string, 0)
	helper("", n, n)
	return ans
}

func helper(str string, left, right int) {
	if left == 0 && right == 0 {
		ans = append(ans, str)
		return
	}
	if left == right {
		//剩余左右括号数相等,下一个只能用左括号
		helper(str+"(", left-1, right)
	} else if left < right {
		//剩余左括号小于右括号,下一个可以用左括号也可以用右括号
		if left > 0 {
			helper(str+"(", left-1, right)
		}
		helper(str+")", left, right-1)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值