1. 程式人生 > >leetcode#22. Generate Parentheses

leetcode#22. Generate Parentheses

rate gin != lee nth 可能 tco leetcode generate

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

例如,給出 n = 3,生成結果為:

[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"]

public:
/*
找左括號,每找到一個左括號,就在左括號後面加一個完整的括號(),最後再在字符串開頭加一個(),就形成了所有的情況
()-> ()() (())->(())(),()(()),()()()->
*/
    vector<string> generateParenthesis(int n)
    {
        if(n==0) return {};
        if(n==1) return {"()"};
        vector<string> result{"()"};
        generateParenthesis(result,n-1);

        return result;
    }

    void generateParenthesis(vector<string>& vec,int n)
    {
        if(n==0) return;
        vector<string> result;
        result.reserve(vec.size()*3);
        for(int i=0;i!=vec.size();++i)
        {
            result.push_back("()"+vec[i]);
            //每個元素,都要找"(",
            for (int j = 0; j < vec[i].size(); ++j)//避免使用叠代器,會失效
                if (vec[i][j] == ‘(‘) 
                {
                    vec[i].insert(vec[i].begin() + j + 1, ‘(‘);
                    vec[i].insert(vec[i].begin() + j + 2, ‘)‘);
                    result.push_back(vec[i]);
                    vec[i].erase(vec[i].begin() + j + 1, vec[i].begin() + j + 3);
                }
        }
        sort(result.begin(),result.end());
        result.erase(unique(result.begin(),result.end()),result.end());
        vec=result;
        generateParenthesis(vec,n-1);
    }
};

leetcode#22. Generate Parentheses