m0_61574664 2021-12-27 13:27 采纳率: 87.1%
浏览 72
已结题

括号生成,力扣上原题,有一些疑惑

class Solution {
void backtrack(vector& ans, string& cur, int open, int close, int n) {
if (cur.size() == n * 2) {
ans.push_back(cur);
return;
}
if (open < n) {
cur.push_back('(');
backtrack(ans, cur, open + 1, close, n);
cur.pop_back();
}
if (close < open) {
cur.push_back(')');
backtrack(ans, cur, open, close + 1, n);
cur.pop_back();
}
}
public:
vector generateParenthesis(int n) {
vector result;
string current;
backtrack(result, current, 0, 0, n);
return result;
}
};
问:来一个认真负责的大佬,详细列举举例一下回溯的过程,我一直不停的推导void backtrack,例如n=3,我只得到了((()))一个结果,希望详细一点
力扣上的原题的官方解析,回溯法,来一个认真负责的大佬

  • 写回答

3条回答 默认 最新

  • togolife 2021-12-27 17:38
    关注
    
    #include <vector>
    #include <string>
    #include <iostream>
    using namespace std;
    
    class Solution
    {
        void backtrack(vector<string> &ans, string &cur, int open, int close, int n)
        {
            if (cur.size() == n * 2)
            {
                ans.push_back(cur);
                return;
            }
            if (open < n)
            {
                cur.push_back('(');
                cout << cur << endl;
                backtrack(ans, cur, open + 1, close, n);
                cur.pop_back();
                cout << cur << endl;
            }
            if (close < open)
            {
                cur.push_back(')');
                cout << cur << endl;
                backtrack(ans, cur, open, close + 1, n);
                cur.pop_back();
                cout << cur << endl;
            }
        }
    
    public:
        vector<string> generateParenthesis(int n)
        {
            vector<string> result;
            string current;
            backtrack(result, current, 0, 0, n);
            return result;
        }
    };
    
    int main(void)
    {
        Solution su;
        vector<string> r = su.generateParenthesis(2);
        cout << "result is: " << endl;
        for (int i = 0; i < r.size(); ++i)
        {
            cout << r[i] << endl;
        }
        return 0;
    }
    
    

    打印每个步骤看一下:
    以n=2为例子:
    1.
    current = ""
    backtrack(result, current, 0, 0, 2);

    2.
    open = 0, close = 0
    current = "("
    backtrack(result, current, 1, 0, 2); --> 进入if(open < n)内的backtrack

    3.
    open = 1, close = 0
    current = "(("
    backtrack(result, current, 2, 0, 2); --> 进入if(open < n)内的backtrack

    4.
    open = 2, close = 0
    current = "(()"
    backtrack(ans, cur, 2, 1, 2); --> 进入if(close < open)内的backtrack

    5.
    open = 2, close = 1
    current = "(())"
    backtrack(ans, cur, 2, 2, 2); --> 进入if(close < open)内的backtrack

    6.
    open = 2, close = 2
    此时current.size() == 4
    执行 ans.push_back(cur); --> 得到第一个合格字符串"(())"

    1. 继续执行第5步

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

      current = "(()"

    2. 继续执行第4步

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

      current = "(("

    3. 继续执行第3步

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

      current = "("

    并且第3步中: open = 1, close = 0, close < open
    执行

    cur.push_back(')');
    backtrack(ans, cur, open, close + 1, n);
    

    current = "()"
    backtrack(ans, cur, 1, 1, 2) --> 进入if(close < open)内的backtrack

    10.
    open = 1, close = 1
    current = "()("
    backtrack(ans, cur, 2, 1, 2); --> 进入if(open < n)内的backtrack

    11.
    open = 2, close = 1
    current = "()()"
    backtrack(ans, cur, 2, 2, 2) --> 进入if(close < open)内的backtrack

    13.
    open = 2, close = 2
    此时current.size() == 4
    执行 ans.push_back(cur); --> 得到第二个合格字符串"()()"

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 matlab中使用gurobi时报错
  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂