iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
佛心分享-刷題不只是刷題

C++刷題:LeetCode Top 100 Liked系列 第 14

Day14 Backtracking 題目1 : 22. Generate Parentheses

  • 分享至 

  • xImage
  •  

Problem :

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

Example 1 :

Input: n = 3
Output: ["((()))","(()())","(())()","()(())","()()()"]

Example 2 :

Input: n = 1
Output: ["()"]

核心思維 :

  1. 設定result儲存結果,並列出當前字串和可用得的左右括號數量
  2. 進行遞迴
  • 若沒有左和右括號,將當前的括號組合放入結果中
  • 若有左括號,則新增 ’ ( ’ 進行遞迴,並進行回溯
  • 若右括號的數量大於左括號的數量,則新增'('進行遞迴,並進行回溯
  1. 回傳結果

程式碼 :

class Solution {
public:
    void solve(vector<string>& result, string output, int left, int right)
    {
        //若沒有左和右括號,將當前的括號組合放入結果中
        if(left == 0 and right == 0){
            result.push_back(output);
            return;
        }
        //若有左括號,則新增'('進行遞迴
        if(left > 0){
            output.push_back('(');
            solve(result,output,left-1,right);
            //回溯,移除最後一個字符進行其他配對
            output.pop_back();
        }
        //若右括號的數量大於左括號的數量,則新增'('進行遞迴
        if(right > left){
            output.push_back(')');
            solve(result,output,left,right-1);
            //回溯,移除最後一個字符進行其他配對
            output.pop_back();
        }
    }
    vector<string> generateParenthesis(int n) {
        //設定result儲存所有組合結果,並列出當前字串
        vector<string> result;
        string output;
        //左和右括號的數量
        int left = n;
        int right = n;
        //進行遞迴
        solve(result,output,left,right);
        //回傳結果
        return result;
    }
};

結論 :

這題的題目是找出題目給予的括號數量可以排列的所有組合,利用遞迴的方式持續進行配對,直到找出所有組合,相比前面堆疊遇到的括號配對問題,回溯的利用遞迴的方式依序配對,方法較為直觀且簡易明瞭,適用於這種較小規模的問題。


上一篇
Day13演算法介紹 : 回溯法(Backtracking)
下一篇
Day15 Backtracking 題目2 : 39. Combination Sum
系列文
C++刷題:LeetCode Top 100 Liked30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言