1. 程式人生 > >Leetcode---括號生成--回溯

Leetcode---括號生成--回溯

括號生成

題目連結:括號生成

思路:
  • 回溯法的結果集一般是搜尋過程中動態生成的
  • 利用條件限制不合法的子集生成,避免龐大的無效遞迴
  • 當結果不滿足條件時返回到上一層,應當恢復為之前的狀態
  • 這裡兩個儲存空間,所以互不影響
public List<String> generateParenthesis(int n) {
		//構造一個結果集
		List<String> list = new ArrayList<String>();
		if(n==0) {
			return list;
		}
		//呼叫回溯
traceback(list,"",0,0,n); return list; } public void traceback(List<String> list,String temp,int left,int right,int n) { //如果左括號越界,或者右括號越界,或者右括號比左括號多,都直接return,不滿足正常括號的要求 //也可視為剪枝,不滿足要求的不再深入遞迴 if(left>n||right>left||right>n) { return ; } //達到遞迴深度了,並且滿足要求的括號新增至結果集 if
(left==n&&right==n) { list.add(temp); return ; } //注意此時temp+'('已經相當於重新申請了一塊記憶體,而不是和temp佔用同一塊,即temp記憶體中的值沒有變化 //下一層新增'('或者')'均可,所以有兩種遞迴 traceback(list,temp+'(',left+1,right,n); //回溯需要返回上一層,所以要儲存之前的值不能被破壞,這裡由於是兩塊記憶體,所以並沒有影響 traceback(list,temp+')',left,right+1,n); }