1. 程式人生 > 遊戲 >類肉鴿戰術遊戲《回淵迷城》Steam商店頁面上線

類肉鴿戰術遊戲《回淵迷城》Steam商店頁面上線

22. 括號生成

數字 n 代表生成括號的對數,請你設計一個函式,用於能夠生成所有可能的並且 有效的 括號組合。

示例 1:

輸入:n = 3
輸出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

輸入:n = 1
輸出:["()"]

提示:

  • 1 <= n <= 8

思路:

​ 使用回溯演算法,那麼我們先去考慮終止條件,n對括號,就是你輸出的字串一共要有2n個元素,並且這些元素的括號是合法的。那麼如何判斷括號合法呢,明顯可以使用棧,入棧'(',如果遇到')'就出棧,如果棧為空就說明沒有左括號自然就非法。那麼只要在使用一個temp字串記錄一下結果就好。

class Solution {
public:
    vector<string>ans;
    stack<char>st;
    string temp="";
    vector<string> generateParenthesis(int n) {
        backtrack(0,2*n);
        return ans;
    }
    void backtrack(int index,int m){
        //base case
        if(index==m){
            if(st.empty()){
                ans.push_back(temp);
                return;
            }else{
                return;
            }
        }

        //選擇左括號
        st.push('(');
        temp+='(';
        backtrack(index+1,m);
        //撤銷選擇
        st.pop();
        temp.pop_back();
        //應該選擇右括號  但是先判斷能不能加右括號
        if(st.empty())return ;//棧為空
        st.pop();//有左括號 那就彈出左括號
        temp+=')';
        backtrack(index+1,m);
        st.push('(');
        temp.pop_back();
    }
};