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日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来