1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 思路: 合法的括号生成过程必然是'('数量大于等于的')',每次新增'('进入下一次递归,直到'('的数量等于请求的数量, 如果')'的数量小于'('的数量,则允许新增一个')',直到')'的数量达到请求的数量为止
代码: function generateParenthesis($n) { $res = []; $this->backtrack($n, '', 0, 0, $res);
return $res; }
function backtrack($n, $cur, $open, $close, &$res) { if (strlen($cur) == $n * 2) { $res[] = $cur;
return; }
if ($open < $n) { //如果'('数量小于$n,加一个'(',进入下一次递归,每次都会新增,直到满足'('数量为止 $this->backtrack($n, $cur . '(', $open + 1, $close, $res); }
if ($close < $open) { //如果')'的数量小于'('的数量,加一个')',允许进入下一次递归,产生分支 $this->backtrack($n, $cur . ')', $open, $close + 1, $res); } }
|