m0_61574664 2021-12-26 09:34 采纳率: 87.1%
浏览 47
已结题

括号生成,力扣上原题,有一些不明白的地方

class Solution {
bool valid(const string& str) {
int balance = 0;
for (char c : str) {
if (c == '(') {
++balance;
} else {
--balance;
}
if (balance < 0) {
return false;
}
}
return balance == 0;
}

void generate_all(string& current, int n, vector& result)

 {
    if (n == current.size()) {
        if (valid(current)) {
            result.push_back(current);
        }
        return;
    }
    current += '(';
    generate_all(current, n, result);
    current.pop_back();
    current += ')';
    generate_all(current, n, result);
    current.pop_back();
}

public:
vector generateParenthesis(int n) {
vector result;
string current;
generate_all(current, n * 2, result);
return result;
}
};
这是力扣上原题的官方解答,暴力解法
问:bool valid这段函数中如果”(“的数比“)”多,balance大于零,这括号不就不成对数吗
问:return balance == 0;返回的结果对于bool valid来说是1还是0。
问:void generate_all(string& current, int n, vector& result),这段代码我明白是要生成所有可能的序列,但是我不明白current += '('; current += ')';这样前后顺序的排列,难道生成的不都是一样的序列吗,我觉得没有多样化啊。能讲讲这是怎么实现的吗。
问:generate_all(current, n, result);这么一连串递归套娃,这个函数什么时候停止呢,难道就没有重复的吗,遇到重复的时候他是怎么解决的,而且即使给了个n,但是我仍然找不到能让这个函数停止的语句啊
来一个负责任的大佬,希望能耐心给我解答一下

  • 写回答

1条回答 默认 最新

  • 南七灵 2021-12-26 10:30
    关注

    balance>0说明不合法啊,继续尝试下一种情况
    只有当balance==0时bool valid的返回值才为1
    假设n = 2首先会一直尝试到((((的情况,再判断是否合法,如果合法就放到结果里,此时第一次递归结束
    然后 current.pop_back();会使字符串变成(((,再添加)变成(((),长度为4时判断是否合法,依旧不合法,继续以上操作
    直到字符串变成(()),才有了第一个合法括号,将其放入结果中,整个的顺序如下
    ((((, (((), (()(, (()), ()((, ()(), ())(, ())), )(((, )((), )()(, )()), ))((, ))(), )))(, ))))
    递归函数结束的标志就是字符串的长度为n,判断是否合法之后直接return了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月3日
  • 已采纳回答 12月26日
  • 创建了问题 12月26日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。