題目:
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:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]題意:
這道題注意一個生成括號很明顯的特徵,那就是在放置括號的時候,如果剩餘的左括號數大於等於剩餘的右括號數,這時候一定要放置左括號,不能放置右括號。
一種遞歸實現的算法如下:
輸入:vector<string> result, string s = "", int n, int leftnums = n, int rightnums = n;
輸出:vector<string> result
function solution() {
若leftnums = 0 並且 rightnums = 0, 將s加入result中
若leftnums > 0 則遞歸調用( s += ‘(’, leftnums -1 )
若rightnums > 0 則遞歸調用( s += ‘)’, rightnums -1)
}
一種c++的代碼實現如下:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
string s = "";
int left_bracket_nums = n;
int right_bracket_nums = n;
recursion_Parenthesis(result,s,left_bracket_nums,right_bracket_nums);
return result;
}
void recursion_Parenthesis(vector<string> &result, string s, int left_bracket_nums, int right_bracket_nums) {
if(left_bracket_nums == 0 && right_bracket_nums == 0) {
result.push_back(s);
}
if(left_bracket_nums > 0) {
recursion_Parenthesis(result,s+'(',left_bracket_nums-1,right_bracket_nums);
}
if(right_bracket_nums > 0 && left_bracket_nums < right_bracket_nums) {
recursion_Parenthesis(result,s+')',left_bracket_nums,right_bracket_nums-1);
}
}
};