回溯算法篇-03:括号生成

力扣22、括号生成

 题目分析

对于括号类问题,有以下两个性质:

  • 一个“合法”的括号组合中,左括号数量一定等于右括号数量
  • 对于一个 “合法” 的括号字符串组合 p ,必然对于任何 0 <= i <= len(p) 都有:子串 p[0...i] 中左括号的数量都大于或等于右括号的数量

这道题从回溯算法的视角来看,可以改写为

现在有 2n 个位置,每个位置可以放置字符 ( 或者 ),组成的所有括号组合中,有多少个是合法的?”

回溯算法就是遍历所有选择得出结果。所以我们需要打印所有的括号组合,然后根据筛选其中合法的括号组合即可

对于路径中的每一个位置,我们都能做出两个选择:“放一个左括号”、“放一个右括号”

解题框架

最终代码

public List<String> generateParenthesis(int n) {
    if (n == 0) return new ArrayList<>();
    // 记录所有合法的括号组合
    List<String> res = new ArrayList<>();
    // 回溯过程中的路径
    StringBuilder track = new StringBuilder();
    // 可用的左括号和右括号数量初始化为 n
    backtrack(n, n, track, res);
    return res;
}

// 可用的左括号数量为 left 个,可用的右括号数量为 rgiht 个
void backtrack(int left, int right, 
            StringBuilder track, List<String> res) {

    //设立结束条件

    // 若左括号剩下的多,说明不合法
    if (right < left) return;
    // 数量小于 0 肯定是不合法的
    if (left < 0 || right < 0) return;
    // 当所有括号都恰好用完时,得到一个合法的括号组合
    if (left == 0 && right == 0) {
        res.add(track.toString());
        return;
    }
    
    // 尝试放一个左括号
    track.append('('); // 选择
    backtrack(left - 1, right, track, res);
    track.deleteCharAt(track.length() - 1); // 撤消选择

    // 尝试放一个右括号
    track.append(')'); // 选择
    backtrack(left, right - 1, track, res);
    track.deleteCharAt(track.length() - 1); // 撤消选择
}

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回溯算法是一种通过穷举所有可能的解来求解问题的算法。它通常用于解决组合、排列、子集和搜索等问题。在回溯算法中,我们通过递归的方式尝试所有可能的选择,并在每一步进行剪枝,以避免无效的搜索。 在给出的引用中,有三个例子展示了使用回溯算法解决不同的问题。第一个例子是找出给定数组中的所有递增子序列。通过递归和剪枝的方式,我们可以找到所有满足条件的子序列。 第二个例子是生成给定字符串中的所有字母大小写组合。通过递归和剪枝的方式,我们可以生成所有可能的组合。 第三个例子是生成有效的括号组合。通过递归和剪枝的方式,我们可以生成所有满足括号匹配规则的组合。 总的来说,回溯算法是一种非常灵活和强大的算法,可以用于解决各种组合和搜索问题。在实际应用中,我们可以根据具体问题的特点来设计回溯算法的实现。 #### 引用[.reference_title] - *1* [python 回溯算法总结](https://blog.csdn.net/weixin_45548695/article/details/124146238)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [python数据结构与算法--回溯算法](https://blog.csdn.net/Melo0705/article/details/99728116)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值