vector<string> generateParenthesis(int n) {
     if (n==1) {
         vector<string> rt_val;
         rt_val.push_back("()");
         return rt_val;
     } else if (n==2) {
         vector<string> rt_val;
         rt_val.push_back("()()");
         rt_val.push_back("(())");
         return rt_val;
     } else {
         unordered_set<string> p_set;
         vector<string> left;
         vector<string> right;
         left = generateParenthesis(n-1);
         for (auto x : left) {
             p_set.insert('('+x+')');
         }
         for (int i=1; i<n; ++i) {
             left = generateParenthesis(i);
             right = generateParenthesis(n-i);
             for (auto x : left) {
                 for (auto y : right) {
                     p_set.insert(x+y);
                 }
             }
         }
         left.clear();
         for (auto k : p_set) {
             left.push_back(k);
         }
         return left;
     }
 }
Пример #2
0
 vector<string> generateParenthesis(int l, int r, int lQ, int rQ, int len) 
 {
     vector<string> ret;
     if(len == 0) return ret;
     
     if(lQ > rQ && r > 0)
     {
         vector<string> v = generateParenthesis(l, r-1, lQ, rQ+1, len-1);
         string s = ")";
         int i;
         for(i=0; i< v.size(); i++)
         {
             
             ret.push_back(s + v[i]);
         }
         if(i == 0)
             ret.push_back(s);
             
     }
     if(l > 0)
     {
         vector<string> v = generateParenthesis(l-1, r, lQ+1, rQ, len-1);
         string s = "(";
         int i;
         for(i=0; i< v.size(); i++)
         {
                  
             ret.push_back(s+ v[i]);
         } 
         if(i == 0)
             ret.push_back(s);
     }
     return ret;
 }
 void generateParenthesis(vector<string> &res, string s, int n, int left_paren, int right_paren){
     if(right_paren==n){
         res.push_back(s);
         return ;
     }
     if(!left_paren){
         s+='(';
         left_paren++;
         generateParenthesis(res, s, n, left_paren, right_paren);
         s.pop_back();
     }
     else{
         if(left_paren<n){
             s+='(';
             left_paren++;
             generateParenthesis(res, s, n, left_paren, right_paren);
             s.pop_back();
             left_paren--;
         }
         if(right_paren<left_paren){
                 s+=')';
                 right_paren++;
                 generateParenthesis(res, s, n, left_paren, right_paren);
                 s.pop_back();
                 right_paren--;
         }
     }
 }
Пример #4
0
 vector<string> generateParenthesis(int n) {
     if(n==0) return vector<string>(1,"") ;
     if(n==1) return vector<string>(1,"()") ;
     vector<string> result;
     for(int i=0;i!=n;i++)
         for(auto inner: generateParenthesis(i))
             for(auto outter:  generateParenthesis(n-i-1))
                 result.push_back("("+inner+")"+outter);
     return result;
 }
 void generateParenthesis(string str, int left, int right, vector<string> &ret)
 {
     if (left == 0 && right == 0)
     {
         ret.push_back(str);
         return;
     }
     if (left > 0) generateParenthesis(str + "(", left - 1, right, ret);
     if (right > left) generateParenthesis(str + ")", left, right - 1, ret);
 }
Пример #6
0
	void generateParenthesis(int left, int right, vector<string>&res, string tmp) {
		if (left == 0 && right == 0) {
			res.push_back(tmp); return;
		}
		if (left > 0) {
			generateParenthesis(left - 1, right, res, tmp + "(");
		}
		if (right > left) {
			generateParenthesis(left, right - 1, res,  tmp + ")");
		}
	}
 void generateParenthesis(int n, int left, int right, string s,
         vector<string>& result) {
     if (left == n && right == n) {
         result.push_back(s);
         return;
     }
     if (left < n) {
         generateParenthesis(n, left+1, right, s + "(", result);
     }
     if (right < left) {
         generateParenthesis(n, left, right+1, s + ")", result);
     }
 }
 void generateParenthesis(vector<string> &res, string s, int n, int left){
     if(!n){
         res.push_back(s);
         return ;
     }
     if(!left)
         generateParenthesis(res, s+'(', n, left+1);
     else{
         if(left<n)
             generateParenthesis(res, s+'(', n, left+1);
         generateParenthesis(res, s+')', n-1, left-1);
     }
 }
Пример #9
0
 void generateParenthesis(int left, int right, string s, vector<string> &ans) {
     if(left == 0 && right == 0) {
         ans.push_back(s);
         return;
     }
     // there are still remaining '('s
     if(left > 0) {
         generateParenthesis(left-1, right, s+'(', ans);
     }
     // for every '(', there is a ')'
     if(right > left) {
         generateParenthesis(left, right-1, s+')', ans);
     }
 }
Пример #10
0
    void generateParenthesis(vector<string> &res, int left,int right,string cur,int n){
    	if(right == n)
    		res.push_back(cur);
    	if(left < n){
    		left ++;
    		generateParenthesis(res,left,right,cur + string("("), n);
    		left --;
    	}
    	if(right < left){
    		right ++;
    		generateParenthesis(res,left,right,cur + string(")"), n);
    		right --;
    	}

    }
Пример #11
0
 vector<string> generateParenthesis(int n) {
     vector<string> result;
     if (n < 1) return result;
     int lc(0);
     int rc(0);
     return generateParenthesis(n, lc, rc);
 }
Пример #12
0
int main(void)
{
	int	n;
	char	**res;
	res = generateParenthesis(1, &n);
	return(0);
}
Пример #13
0
    vector<string> generateParenthesis(int n) {
        if(n == 0) {
            vector<string> res;
            res.clear();
            res.push_back("");
            return res;
        }

        vector<string> last = generateParenthesis(n - 1);
        vector<string> res;
        res.clear();
        set<string> res1;
        res1.clear();
        for(int i = 0; i < last.size(); ++i) {
            int len = 2 * (n - 1);
            for(int j = 0; j <= len; ++j) {
                string tmp = last[i];
                tmp.insert(j, "()");
                res1.insert(tmp);
            }
        }
        
        for(auto it = res1.begin(); it != res1.end(); it++) {
            res.push_back(*it);
        }
        return res;
    }
Пример #14
0
 vector<string> generateParenthesis(int n) {
     // Start typing your C/C++ solution below
     // DO NOT write int main() function
     if (n==0){
         return vector<string> (1,"");
     }else if (n==1){
         return vector<string> (1,"()");
     }
     vector<string> vs_short = generateParenthesis(n-1);
     vector<string> vs(0);
     for (int i=0; i<vs_short.size(); ++i){
         string s = vs_short[i];
         int stk = 0;
         for (int j=0; j<s.size(); ++j){
             if (stk==0){
                 vs.push_back("("+s.substr(0,j)+")"+s.substr(j,s.size()-j));
             }
             if (s[j]=='('){
                 stk++;
             }else if (s[j]==')'){
                 stk--;
             }
         }
         vs.push_back("("+s+")");
     }
     return vs;
 }
 /**
  * @param n n pairs
  * @return All combinations of well-formed parentheses
  */
 vector<string> generateParenthesis(int n) {
     // Write your code here
     vector<string> answers;
     string parenthesis;
     generateParenthesis(0, parenthesis, n, answers);
     return answers;
 }
  vector<string> generateParenthesis(int n) {
    if (n == 0) return vector<string>(1, "");
    if (n == 1) return vector<string>(1, "()");
    if (Cache.count(n)) return Cache[n];
    vector<string> result;
    for (int i = 0; i < n; ++i) {
      vector<string> a = generateParenthesis(i), b = generateParenthesis(n - 1 - i);
      for (int j = 0; j < a.size(); ++j) {
	for (int k = 0; k < b.size(); ++k) {
	  result.push_back("(" + a[j] + ")" + b[k]);
	}
      }
    }
    Cache[n] = result;
    return result;        
  }
 void generateParenthesis(int left, string &parenthesis, const int n, vector<string> &answers) {
     if (left == n && parenthesis.length() == n + n) {
         answers.push_back(parenthesis);
         return;
     }
     if (left < n) {
         parenthesis += '(';
         generateParenthesis(left + 1, parenthesis, n, answers);
         parenthesis.pop_back();
     }
     if (left + left > parenthesis.length()) {
         parenthesis += ')';
         generateParenthesis(left, parenthesis, n, answers);
         parenthesis.pop_back();
     }
 }
Пример #18
0
 void generateParenthesis(int n, int left, int right, string& s) {
   if (left == n && right == n) {
     r.push_back(s);
     return;
   }
   if (right < left) {
     s.push_back(')');
     generateParenthesis(n, left, right + 1, s);
     s.pop_back();
   }
   if (left < n) {
     s.push_back('(');
     generateParenthesis(n, left + 1, right, s);
     s.pop_back();
   }
 }
Пример #19
0
 void generateParenthesis(int iNumber, set<string> & setResult)
 {
     if (iNumber <= 0)
     {
         return;
     }
     
     if (iNumber == 1)
     {
         setResult.insert("()");
         return;
     }
     
     set<string> setPrevResult;
     
     generateParenthesis(iNumber - 1, setPrevResult);
     
     for (set<string>::iterator setIterator = setPrevResult.begin(); setIterator != setPrevResult.end(); setIterator ++)
     {
         for (int iIndex = 0; iIndex < (*setIterator).length(); iIndex ++)
         {
             setResult.insert((*setIterator).substr(0, iIndex) + "()" + (*setIterator).substr(iIndex));
         }
         
         setResult.insert((*setIterator) + "()");
     }
 }
Пример #20
0
 vector<string> generateParenthesis(int n) {
     // Start typing your C/C++ solution below
     // DO NOT write int main() function
     vector<string> ret;
     if(n == 0) return ret;
     ret = generateParenthesis(n, n, 0, 0, 2*n);
     return ret;
 }
Пример #21
0
int main()
{
    char **result;
    int returnSize;
    result=generateParenthesis(3,&returnSize);
    print_arr_arr((int **)result,returnSize,3);
    return 0;
}
Пример #22
0
 vector<string> generateParenthesis(int n) {
   // Start typing your C/C++ solution below
   // DO NOT write int main() function
   r.clear();
   string s;
   generateParenthesis(n, 0, 0, s);
   return r;
 }
 // second version -- without right_paren
 vector<string> generateParenthesis(int n) {
     vector<string> res;
     if(n){
         string s;
         generateParenthesis(res, s, n, 0);
     }
     return res;
 }
Пример #24
0
 vector<string> generateParenthesis(int n) {
     vector<string> ret;
     int rever_n = 0;
     int i = n;
     string str;
     generateParenthesis(ret, str, 2*n, i, rever_n, 0);
     return ret;
 }
Пример #25
0
void testGenerateParenthesis(){
    int count = 0;
    char** result = generateParenthesis(3,&count);
    for(int i = 0; i < count;i++){
        printf("%s,",result[i]);
    }

}
Пример #26
0
 vector<string> generateParenthesis(int n) {
     vector<string> ans;
     if(n == 0) {
         return ans;
     }
     string s;
     generateParenthesis(n, n, s, ans);
     return ans;
 }
 // first version
 vector<string> generateParenthesis(int n) {
     vector<string> res;
     if(n){
         string s;
         int left_paren=0, right_paren=0;
         generateParenthesis(res, s, n, left_paren, right_paren);
     }
     return res;
 }
 // refer to unique binary search trees II  
 // Key: a possible parenthesis = i outer()s + ( +  n-i-1 inner()s   + )
 vector<string> generateParenthesis(int n) {
     vector<string> parens;
     if(n==0) {
         parens.push_back("");
         return parens;
     }
     if(n==1) {
         parens.push_back("()");
         return parens;
     }
     for(int i=0; i<n; i++){
         for(string outer : generateParenthesis(i)){
             for(string inner : generateParenthesis(n-i-1)){ // here, think carefully
                 parens.push_back(outer+"("+inner+")");
             }
         }
     }
     return parens;
 }
Пример #29
0
 vector<string> generateParenthesis(int n, int lc, int rc) {
     if (rc == n) return vector<string>(1, "");
     vector<string> res;
     // option 1 : put (
     if (lc < n) {
         vector<string> tmp = generateParenthesis(n, lc+1, rc);
         for (int i = 0; i < tmp.size(); ++i) {
             res.push_back("(" + tmp[i]);
         }
     }
     if (lc > rc) {
         // if left count > right count, can put )
         vector<string> tmp = generateParenthesis(n, lc, rc+1);
         for (int i = 0; i< tmp.size(); ++i) {
             res.push_back(")" + tmp[i]);
         }
     }
     return res;
 }
Пример #30
0
void generateParenthesisMain(voia){
    int returnSize = 0;
    char** result = generateParenthesis(4, &returnSize);
    while(returnSize>0){
        printf("%s\n", result[returnSize-1]);
        free(result[returnSize-1]);
        returnSize--;
    }
    free(result);
}