LeetCode 22.括号生成

详情链接:22. 括号生成

1.问题思路

这里先弄清有效括号有什么特点。
① 左括号永远在左边。
② 左括号的数量等于右括号。
这里我们可以记录左括号数量=右括号数量=targetNum,进行dfs遍历,每次对括号进行-1操作。
① 终止条件,right括号数<左括号数, 代表已使用的右括号数量比左括号数量多当前已经是无效结果了 需要退出。还有一种就是左右括号已经用完了。
② 每层的广度优先都是2,要么是左括号,要么就是右括号。

2.代码实现

class Solution {
        List<String> result = new ArrayList<String>();
        StringBuilder sb = new StringBuilder();

        public List<String> generateParenthesis(int n) {
            // 特判
            if (n == 0) {
                return result;
            }
            dfs(0, 0, n);
            return result;
        }


        public void dfs(int leftNum, int rightNum, int n) {
            // 终止条件
            if(leftNum == n && rightNum == n) {
                result.add(sb.toString());
                return;
            }

            // 剪枝条, 剩下的左括号应该要大于右括号。如果小于则不何可
            // 要保证以左括号开始,右括号结束
            if (leftNum < rightNum) {
                return;
            }
			
		    // 左括号还存在,进行下层递归
            if (leftNum < n) {
                sb.append('(');
                dfs(leftNum+1, rightNum, n);
                // 回溯
                sb.deleteCharAt(sb.length()-1); // 递归后需进行回溯
            }

			// 右括号还存在,进行下层递归
            if (rightNum < n) {
                sb.append(')');
                dfs(leftNum, rightNum+1, n);  
                sb.deleteCharAt(sb.length()-1);  // 递归后需进行回溯
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值