[leetcode] Generate Parentheses
阿新 • • 發佈:2018-09-16
turn 時間 adding pre dot leetcode ive question 什麽
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
分析:題目要求找給定n情況下,匹配的括號。
第一個想法,判斷括號是否匹配想到用stack來做,但是這樣的話就得先生成所有的組合,然後一一進行判斷,時間復雜度肯定非常高。所以排除不用。
第二個想法,遞歸的方法。為什麽想到遞歸呢,也沒法說清,因為括號要匹配,那麽如果前面沒有匹配上,後面肯定就不需要再比較了。有點像DFS的思想。就先跟著遞歸的思路看一下:
設兩個變量left,right分別代表字符串左括號的數量和右括號的數量。
遞歸結束條件:if ( left == n && right == n )
因為如果某個狀態下,左括號小於右括號,那麽肯定是錯誤的:if ( left < right ) break;
接下來就需要判斷在當前位置添加左括號還是右括號了:if( left < n ) 添加左括號 if( left > right ) 添加右括號
代碼如下:
1 class Solution { 2 List<String> res = new ArrayList<>(); 3 public List<String> generateParenthesis(int n) { 4 helper(0,0,"",n); 5 return res; 6 } 7 private void helper(int left, int right, String str, int n) { 8 //遞歸結束條件 9 if(left == n && right == n) { 10 res.add(str); 11 return; 12 } 13 if ( right > left ) return; 14 if ( left < n ) helper(left+1,right,str+"(",n); 15 if ( right < left ) helper(left,right+1,str+")",n); 16 } 17 }
運行時間2ms。
看了一下只有8個測試用例,感覺如果用第一種方法應該可以過,只是時間復雜度比較高。
遞歸大法好。
[leetcode] Generate Parentheses