日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 22. 括号生成(回溯/DP)

發布時間:2024/7/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 22. 括号生成(回溯/DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 暴力回溯
      • 2.2 DP

1. 題目

給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的并且有效的括號組合。

例如,給出 n = 3,生成結果為:["((()))","(()())","(())()","()(())","()()()" ]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/generate-parentheses
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

2.1 暴力回溯

  • 利用棧檢查是否有效

class Solution { public:vector<string> generateParenthesis(int n) {stack<char> stk;vector<string> ans;string str;int k = 2*n;bt(stk,k,0,str,ans);return ans;}void bt(stack<char> stk, int &k, int i, string str, vector<string> &ans){if(i == k){if(stk.empty())ans.push_back(str);return;}stk.push('(');bt(stk,k,i+1,str+"(",ans);stk.pop();if(!stk.empty()){stk.pop();bt(stk,k,i+1,str+")",ans);}} };
  • 用左右括號數量來判斷:任何時候,右括號不能大于左括號個數

class Solution { public:vector<string> generateParenthesis(int n) {vector<string> ans;string str;int k = 2*n;bt(0,0,k,0,str,ans);return ans;}void bt(int L, int R, int &k, int i, string str, vector<string> &ans){if(L < R)return;if(i == k){if(L == R)ans.push_back(str);return;}bt(L+1,R,k,i+1,str+"(",ans);bt(L,R+1,k,i+1,str+")",ans);} }; class Solution { // 2020.3.27vector<string> ans;int N;vector<char> ch ={'(',')'}; public:vector<string> generateParenthesis(int n) {N = 2*n;string t;dfs(t,0,0,n,0);return ans;}void dfs(string& t, int l, int r, int n, int count){if(l<r || l > n || r > n)return;if(count == N){ans.push_back(t);return;}for(int i = 0; i < 2; ++i){t.push_back(ch[i]);if(i==0) dfs(t,l+1,r,n,count+1);else dfs(t,l,r+1,n,count+1);t.pop_back();}} };

2.2 DP

另有DP解法,見別人解答

class Solution { //DP public:vector<string> generateParenthesis(int n) {if (n == 0) return {};if (n == 1) return { "()" };vector<vector<string>> dp(n+1);dp[0] = { "" };dp[1] = { "()" };for (int i = 2; i <= n; i++) { //求dp[i] 在所有dp[0],...dp[i-1]的基礎上進行組合for (int j = 0; j <i; j++) {for (string p : dp[j])for (string q : dp[i - j - 1]) { //j對括號的p,+ 1對新括號 + i-j-1對括號的 q = i對括號string str = "(" + p + ")" + q;dp[i].push_back(str);}}}return dp[n];} }; 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的LeetCode 22. 括号生成(回溯/DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。