括号生成 Generate Parentheses
思路
- 可使用递归向字符串里添加
"("
或者")"
- 左括号的数量必须大于右括号的数量才能添加右括号
代码
public class Solution {
public IList<string> GenerateParenthesis(int n) {
List<string> result=new List<string>();
BackTrack(result,"",0,0,n);
return result;
}
public void BackTrack( List<string> result,string s,int open,int close,int n){
if(open+close==2*n)
{
result.Add(s);
return;
}
if(open<n)
{
BackTrack(result,s+"(",open+1,close,n);
}
if(open>close)
{
BackTrack(result,s+")",open,close+1,n);
}
}
- open和close分别记录
"("
和")"
的数量 - 这是个回溯法,具体可百度。基本定义为:回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
- 因为
BackTrack(result,s+"(",open+1,close,n);
在 BackTrack(result,s+")",open,close+1,n);
之前。例如n=3。第一次return:"((()))"
,return后,退到"(("
,然后执行第二个左括号对应那个方法的 BackTrack(result,s+")",open,close+1,n);
。最后得到"(()())"
。其他同理。