[LeetCode] Generate Parentheses

https://leetcode.com/problems/generate-parentheses/?tab=Description

这道题虽然最后的代码简单,但是想到怎么做却并不容易。后来也是看了discuss才会做...递归的思路是分别跟踪当前剩余的左括号和右括号数量,然后分出两支:

  1. 加一个左括号,并往下递归;
  2. 如果剩余右括号数多于剩余左括号数,则加右括号,并往下递归;否则什么也不做

注意在分支2中,“剩余右括号数多于剩余左括号数”这个条件很重要,有了这个条件的约束,可以避免不合法的括号组合,比如n=2,")()("就是不合法的组合。

/*
 * author : TK
 * date   : 2017-02-15
 * problem: LeetCode 22. Generate Parentheses
 * method : Depth-First-Search
 * lang   : C++
 */
class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> ret;
        
        string str = "";
        dfs(ret, str, n, n);
        
        return ret;
    }
    
    void dfs(vector<string>& ret, string str, int left_remain, int right_remain) {
        if (left_remain == 0 && right_remain == 0) {
            ret.push_back(str);
            return;
        }
        if (left_remain > 0) dfs(ret, str + "(", left_remain - 1, right_remain);
        if (right_remain > left_remain) dfs(ret, str + ")", left_remain, right_remain - 1);
    }
};
posted @ 2017-02-15 22:13  mioopoi  阅读(108)  评论(0)    收藏  举报