使用 C 语言生成 n 对括号的有效组合

问题分析: 本问题要求打印出 n 对括号的所有有效组合,即左右括号必须正确匹配。例如当 n=3 时,有效组合为'((()))', '(()())', '(())()', '()(())', '()()()'。

解题思路: 可以使用递归的方法解决本问题。首先定义一个递归函数,该函数有三个参数:当前要生成的字符串、左括号的数量、右括号的数量。递归函数的终止条件是当左右括号的数量都为 n 时,将当前字符串打印出来。在递归函数中,首先判断是否可以放置左括号,即左括号的数量是否小于 n,如果满足条件,则将左括号的数量加 1,并且将当前字符串加上一个左括号,然后递归调用自己。接着判断是否可以放置右括号,即右括号的数量是否小于左括号的数量,如果满足条件,则将右括号的数量加 1,并且将当前字符串加上一个右括号,然后递归调用自己。最后,在递归函数的外部调用该函数,传入初始参数空字符串、0 和 0。

完整的代码注释:

#include <stdio.h>

// 递归函数,用于生成括号的有效组合
void generateParenthesis(char* str, int left, int right) {
    // 当左右括号的数量都为 n 时,打印当前字符串
    if (left == right && left == n) {
        printf('%s\n', str);
        return;
    }
    // 如果左括号的数量小于 n,可以放置左括号
    if (left < n) {
        str[left+right] = '('; // 在当前字符串的末尾加上一个左括号
        generateParenthesis(str, left+1, right); // 递归调用自己,在左括号的数量加 1 的基础上继续生成
    }
    // 如果右括号的数量小于左括号的数量,可以放置右括号
    if (right < left) {
        str[left+right] = ')'; // 在当前字符串的末尾加上一个右括号
        generateParenthesis(str, left, right+1); // 递归调用自己,在右括号的数量加 1 的基础上继续生成
    }
}

int main() {
    int n = 3; // 括号对数
    char str[2*n + 1]; // 生成的括号字符串,长度为 2n+1,最后一个字符为 '\0'
    generateParenthesis(str, 0, 0); // 调用递归函数,初始时左右括号的数量都为 0
    return 0;
}

时间复杂度分析: 递归函数的时间复杂度为 O(2^n),因为在每一层递归的时候,都会有两个分支,即放置左括号和放置右括号。总共有 2^n 个叶子结点,所以时间复杂度为 O(2^n)。

C语言实现括号有效组合生成 - 递归算法详解

原文地址: https://www.cveoy.top/t/topic/ck7b 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录