day157—回溯—括号生成(LeetCode-22)

题目描述

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

示例 1:

复制代码
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

复制代码
输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

解决方案:

这段生成有效括号的代码,其核心逻辑完全契合数学归纳法 的证明思路 ------ 通过open(左括号数)和close(右括号数)的规则约束,既验证了最小规模问题的正确性,又能从 n=k 的有效解推导出 n=k+1 的有效解,最终证明代码可生成所有 n 对有效括号组合。

核心逻辑(数学归纳法视角)

  1. 基础步(n=1 时命题成立) :当 n=1 时,代码通过open<1先添加左括号(open=1),再通过close<open添加右括号(close=1),最终生成唯一有效组合(),符合 n=1 时的所有解,命题成立。

  2. 归纳步(假设 n=k 成立,推导 n=k+1 成立)

    • 归纳假设:假设 n=k 时,代码能生成所有 k 对有效括号组合,且每个组合满足 "左括号总数 = 右括号总数 = k""任意前缀左括号数≥右括号数"(由close<open保证);
    • 推导 n=k+1:代码中open<k+1保证左括号总数最终为 k+1,close<open保证任意时刻右括号不超过左括号(维持有效前缀)。回溯过程本质是在 n=k 的有效组合基础上,通过 "先加左括号拓展规模,再加右括号补全" 的方式,构造出所有 k+1 对有效组合(比如 n=2 的(())/()(),均可由 n=1 的()推导而来),因此 n=k+1 时命题也成立。
  3. 归纳结论:基础步和归纳步均成立,说明对所有正整数 n,代码都能生成 n 对所有合法的有效括号组合。

关键变量的归纳法作用

  • open:控制左括号总数最终等于 n(基础步保证 n=1 时总数为 1,归纳步保证从 k 到 k+1 时总数递增);
  • close:通过close<open约束,保证任意前缀的合法性(基础步避免 n=1 时出现),归纳步避免 n=k+1 时出现无效前缀)。

总结

  1. 数学归纳法验证了代码的完整性:能覆盖所有 n≥1 的有效括号组合,无遗漏;
  2. openclose的规则是归纳法的核心支撑:前者保证括号总数符合要求,后者保证组合的有效性;
  3. 回溯过程本质是归纳法的 "递推实现",从最小规模解逐步推导到任意规模解。

函数源码:

cpp 复制代码
class Solution {
public:
    void backtrack(vector<string>& ans, string& cur, int open, int close, int n) {
        int len=cur.size();
        if(len==n*2){
            ans.push_back(cur);
            return;
        }

        if(open<n){
            cur+='(';
            backtrack(ans,cur,open+1,close,n);
            cur.pop_back();
        }
        if(close<open){
            cur+=')';
            backtrack(ans,cur,open,close+1,n);
            cur.pop_back();
        }
    }

    vector<string> generateParenthesis(int n) {
        vector<string> ans={};
        string cur="";
        backtrack(ans,cur,0,0,n);
        return ans;
    }
};
相关推荐
郝学胜-神的一滴25 分钟前
[简化版 GAMES 101] 计算机图形学 04:二维变换上
c++·算法·unity·godot·图形渲染·unreal engine·cesium
ZC跨境爬虫25 分钟前
海南大学交友平台开发实战day7(实现核心匹配算法+解决JSON请求报错问题)
前端·python·算法·html·json
计算机安禾30 分钟前
【数据结构与算法】第41篇:图论(五):拓扑排序与关键路径
c语言·数据结构·c++·算法·图论·visual studio
Q741_14733 分钟前
每日一题 力扣 1320. 二指输入的的最小距离 动态规划 C++ 题解
c++·算法·leetcode·动态规划
wfbcg41 分钟前
每日算法练习:LeetCode 76. 最小覆盖子串 ✅
算法·leetcode·职场和发展
Wect1 小时前
LeetCode 149. 直线上最多的点数:题解深度剖析
前端·算法·typescript
qianpeng8971 小时前
运动声源的到达结构仿真
算法
费曼学习法1 小时前
线段树:区间查询的"终极武器",一文看透高效范围统计
算法
wayz111 小时前
Day 2:线性回归原理与正则化
算法·机器学习·数据分析·回归·线性回归
QQ676580081 小时前
基于yolo26算法的水下目标检测图像数据集 海洋生物识别 海胆识别 海龟识别数据集 海洋生物监测与保护工作 潜水作业安全辅助系 水下环境感知第10408期
算法·目标检测·水下目标检测·海洋生物识别·海胆 海龟识别·海洋生物监测与保护工作·潜水作业安全辅助 水下环境感知