題目:括號生成
思路
1.分析問題:生成所有可能的並且有效的組合?問題是讓我們羅列所有的可能性,很容易想到遍歷搜索,那麼常見的搜索方式有dfs和bfs。這裏用dfs。
2.該怎麼用dfs:平常都在樹結構中使用dfs,可以將此題設置成數結構的環境
畫個圖
解釋一下下面的靈魂圖,根節點是“”,往左是左括號,往右是右括號
如何將題目場景與樹結構匹配呢?除了節點內容,還需要有指向左子樹和右子樹的箭頭,我們用int left和right來表示,left+1表示指向左子樹,right+1表示指向右子樹;
寫dfs的步驟
a.邊界條件:什麼時候可以結束呢?當然是如下,左右括號的數量都要等於n,才能保證括號是有效的;
left==n&&right==n)
b.要排除無效的括號,也就是遞歸中的剪枝:left<right的時候是無效的
c.剩下正常的左右子樹遍歷;
代碼
class Solution {
List<String> list=new ArrayList<>();
public List<String> generateParenthesis(int n) {
dfs("",0,0,n);
return list;
}
public void dfs(String str,int left,int right,int n){
if(left==n&&right==n){
list.add(str);
return;
}
if(left<right) return;
if(left<n) dfs(str+"(",left+1,right,n);
if(right<n) dfs(str+")",left,right+1,n);
}
}