22. 括号生成
题目链接
看到组合两个字,想到组合题常用方法回溯。
C++:
class Solution {
public:
vector<string> generateParenthesis(int n) {
if(n==0) return {};
if(n ==1) return {"()"};
vector<string> result;
traceback(result,{},n,0,0,0);
return result;
}
void traceback(vector<string> &result, string temp_s, int n, int idx,int left,int right)
{
if(idx == 2*n) // 字符串长度满足要求时
{
result.push_back(temp_s);
return ;
}
if(left < n)//当左括号个数小于n,添加左括号才是合法的
traceback(result,temp_s+'(',n,idx+1,left+1,right);
if(right < left)//当右括号括号个数小于左括号,还能添加右括号
traceback(result,temp_s+')',n,idx+1,left,right+1);
}
};
python:
class Solution:
def traceback(self, n: int, ans: List[str], s, left: int, right: int):
if len(s) == n*2:
ans.append(s)
return ans
if left < n:
self.traceback(n, ans, s+'(', left+1, right)
if right < left:
self.traceback(n, ans, s+')', left, right+1)
def generateParenthesis(self, n: int) -> List[str]:
ans = list()
self.traceback(n, ans, "", 0, 0)
return ans
后来提交python代码后,发现执行时间最短的是动态规划,力扣题解中有大佬讲的很详细了,链接放在这里:动态规划
我写的C++动态规划:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<vector<string> > ans;
ans.push_back({""});
ans.push_back({"()"});
for(int i = 2; i <= n; i++)
{
vector<string> v;
for(int j = 0; j < i; j++)
{
vector<string> v1 = ans[j];
vector<string> v2 = ans[i-j-1];
for(string inside : v1)
{
for(string outside : v2)
{
string s = "(" + inside + ")" + outside;
v.push_back(s);
}
}
}
ans.push_back(v);
}
return ans[n];
}
};
如果对你有帮助的话,请点个赞哦!