1. 程式人生 > >leetcode學習筆記38

leetcode學習筆記38

22. Generate Parentheses

For example, given n = 3, a solution set is:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

這道題是借鑑網上的思路解出的,主要摘自
https://www.1point3acres.com/bbs/thread-172641-1-1.html
所謂Backtracking都是這樣的思路:在當前局面下,你有若干種選擇。那麼嘗試每一種選擇。如果已經發現某種選擇肯定不行(因為違反了某些限定條件),就返回;如果某種選擇試到最後發現是正確解,就將其加入解集

所以你思考遞迴題時,只要明確三點就行:選擇 (Options),限制 (Restraints),結束條件 (Termination)。即“ORT原則”(這個是我自己編的)

對於這道題,在任何時刻,你都有兩種選擇:

  1. 加左括號。
  2. 加右括號。

同時有以下限制:

  1. 如果左括號已經用完了,則不能再加左括號了。
  2. 如果已經出現的右括號和左括號一樣多,則不能再加右括號了。因為那樣的話新加入的右括號一定無法匹配。

結束條件是:
左右括號都已經用完。

結束後的正確性:
左右括號用完以後,一定是正確解。因為1. 左右括號一樣多,2. 每個右括號都一定有與之配對的左括號。因此一旦結束就可以加入解集(有時也可能出現結束以後不一定是正確解的情況,這時要多一步判斷)。

遞迴函式傳入引數:
限制和結束條件中有“用完”和“一樣多”字樣,因此你需要知道左右括號的數目。
當然你還需要知道當前局面sublist和解集res。

class Solution {
	public List<String> generateParenthesis(int n) {
        ArrayList<String> res=new ArrayList<String>();
        backtrack(res,"",n,n);
        return res;
    }
     public void backtrack
(List<String> res,String substring,int left,int right) { if(left==0&&right==0){ res.add(substring); return; } if(left>0){ backtrack(res,substring+"(",left-1,right); } if(left<right){ backtrack(res,substring+")",left,right-1); } } }