Leetcode 22. 괄호 생성

설명



n 쌍의 괄호가 주어지면 잘 구성된 괄호의 모든 조합을 생성하는 함수를 작성하십시오.

예 1:




Input: n = 3
Output: ["((()))","(()())","(())()","()(())","()()()"]


예 2:




Input: n = 1
Output: ["()"]


해결책:


  • 이 솔루션은 역추적을 사용합니다.
  • 역추적은 가능한 모든 조합을 반복하는 체계적인 방법입니다.
  • 이러한 유형의 문제는 유사한 패턴을 따릅니다.

  • // function to return answer and adds the params to the 
    // recursive backtracking function 
    function setup(n) {
        // answer to return
        // recursive backtrack(answer, emptyCombination);
        // return answer;
    };
    
    function backtrack(ans, curentCombination) {
        // if (base case) {
        //   add curentCombination to answer
        //}
    
        // logic for recursive call to add items 
        // to curentCombination
    }
    


  • 유효한 괄호 조합을 재귀적으로 구성하고 배열로 반환합니다.
  • 재귀 알고리즘은 재귀 호출에서 벗어나기 위해 기본 사례가 필요합니다.
  • 가능한 기본 케이스에 대해 생각해 봅시다
  • 이 문제에서 모든 여는 괄호에는 해당 닫는 괄호가 있어야 합니다(여는 수 ==== 닫는 수). 따라서 유효한 조합의 총 괄호 수 = 여는 매개변수 + 닫는 매개변수 = n x 2
  • 유효한 조합은 길이가 n x 2를 초과할 수 없으므로 이 검사를 기본 사례로 사용하겠습니다
  • .
  • 기본 사례에 도달하면 현재 조합이 유효하고 출력 배열에 추가할 수 있다는 것을 알게 됩니다.

  •     if (cur.length == max * 2) {
            ans.push(cur);
            return;
        }
    


  • 조합에 추가할 때 여는 괄호나 닫는 괄호를 추가할 수 있으며 각각 n개의 값이 있어야 합니다
  • .
  • 조합이 유효하려면 여는 괄호를 먼저 추가해야 합니다
  • .
  • 현재 조합에 이 괄호를 추가하면 최대 제한(n)에 도달할 때까지 더 추가합니다
  • .
  • 재귀 호출을 통해 이 논리를 반복할 수 있습니다.

  •     if (open < max)
            backtrack(ans, cur+"(", open+1, close, max)
    


  • 여는 괄호를 추가했으면 유사한 재귀 논리를 통해 닫는 괄호를 추가해야 합니다.

  •     if (close < open)
            backtrack(ans, cur+")", open, close+1, max);
    


  • 우리는 설정 기능에서 각각에 대해 0에서 시작하는 현재 조합의 각 괄호 유형을 추적합니다
  • .
  • 현재 조합은 빈 문자열로 시작하고 각 호출에 괄호가 추가됩니다.
  • 설정 기능은 다음과 같습니다.

  •  var generateParenthesis = function(n) {
        const ans = [];
        backtrack(ans, "", 0, 0, n);
        return ans;
    };
    


    전체 솔루션




     var generateParenthesis = function(n) {
        const ans = [];
        backtrack(ans, "", 0, 0, n);
        return ans;
    };
    
    function backtrack(ans, cur, open, close, max) {
        if (cur.length == max * 2) {
            ans.push(cur);
            return;
        }
    
        if (open < max)
            backtrack(ans, cur+"(", open+1, close, max);
        if (close < open)
            backtrack(ans, cur+")", open, close+1, max);
    }
    
    

    좋은 웹페이지 즐겨찾기