22. Generate Parentheses

Description

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

For example, given n = 3, a solution set is:
[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

Solution

給定整數(shù)n蔚晨,產(chǎn)生n對括號構成的配對字符串,常規(guī)的排列組合問題肛循,遞歸和迭代兩類解法,medium

  • 遞歸法
    left和right表示還剩多少'('银择、')'可以放置多糠,因此對于'(',只要left>0即可以向下層調(diào)用浩考,而對于')'必須保證right>left夹孔,否則無法完成配對
vector<string> generateParenthesis(int n) {
    vector<string> ret;
    this->dfsGenerateParenthesis(ret, "", n, n);
    return ret;
}
void dfsGenerateParenthesis(vector<string>& ret, string s, int left, int right) {
    if (left ==0 && right == 0) {
        ret.push_back(s);
        return ;
    }
    if (left > 0) {
        this->dfsGenerateParenthesis(ret, s + '(', left - 1, right);
    }
    if (right > left) {
        this->dfsGenerateParenthesis(ret, s + ')', left, right - 1);
    }
}
  • 迭代法
    循環(huán)遍歷,層次交換,每一輪的結果是在上一輪結果的基礎上進行加工生成的搭伤,并且中間結果還需要攜帶left只怎、right的字段信息,因此定義了新的struct
struct MyNode {
    int left;
    int right;
    string path;
    MyNode(int x, int y, string s) : left(x), right(y), path(s) {}
};
class Solution {
public:
    vector<string> generateParenthesis(int n) {
        MyNode node(n, n, "");
        vector<MyNode> retInfo(1, node);
        vector<string> ret;
        for (int i = 0; i < 2 * n; ++i) { //一共要放置2*n個字符
            vector<MyNode> curRetInfo;
            for (int j = 0; j < retInfo.size(); ++j) {
                int left = retInfo[j].left, right = retInfo[j].right;
                string s = retInfo[j].path;
                if (left > 0) {
                    MyNode node(left - 1, right, s + '(');
                    curRetInfo.push_back(node);
                }
                if (right > left) {
                    MyNode node(left, right - 1, s + ')');
                    curRetInfo.push_back(node);
                }
            }
            retInfo = curRetInfo;
        }
        for (int k = 0; k < retInfo.size(); ++k) {
            ret.push_back(retInfo[k].path);
        }
        return ret;
    }
};
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怜俐,一起剝皮案震驚了整個濱河市身堡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拍鲤,老刑警劉巖贴谎,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異季稳,居然都是意外死亡擅这,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門景鼠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仲翎,“玉大人,你說我怎么就攤上這事铛漓∷菹悖” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵票渠,是天一觀的道長逐哈。 經(jīng)常有香客問我,道長问顷,這世上最難降的妖魔是什么昂秃? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮杜窄,結果婚禮上肠骆,老公的妹妹穿的比我還像新娘。我一直安慰自己塞耕,他們只是感情好蚀腿,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扫外,像睡著了一般莉钙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筛谚,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天磁玉,我揣著相機與錄音,去河邊找鬼驾讲。 笑死蚊伞,一個胖子當著我的面吹牛席赂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播时迫,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颅停,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掠拳?” 一聲冷哼從身側(cè)響起癞揉,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碳想,沒想到半個月后烧董,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡胧奔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年逊移,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龙填。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡胳泉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岩遗,到底是詐尸還是另有隱情扇商,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布宿礁,位于F島的核電站案铺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梆靖。R本人自食惡果不足惜控汉,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望返吻。 院中可真熱鬧姑子,春花似錦、人聲如沸测僵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捍靠。三九已至沐旨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榨婆,已是汗流浹背希俩。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纲辽,地道東北人颜武。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像拖吼,于是被迫代替她去往敵國和親鳞上。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容