diff --git a/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_1.py b/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_1.py new file mode 100644 index 0000000..6217c51 --- /dev/null +++ b/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_1.py @@ -0,0 +1,21 @@ +# backtracking +class Solution: + def generateParenthesis(self, n: int) -> List[str]: + def make_combination(current): + if remain["("] > remain[")"]: + return + if remain["("] < 0: + return + if remain[")"] == 0: + parentheses.append(current) + return + for bracket in brackets: + remain[bracket] -= 1 + make_combination(current + bracket) + remain[bracket] += 1 + + brackets = ["(", ")"] + remain = {"(": n, ")": n} + parentheses = [] + make_combination("") + return parentheses diff --git a/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_2.py b/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_2.py new file mode 100644 index 0000000..c21b82f --- /dev/null +++ b/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_2.py @@ -0,0 +1,16 @@ +# backtracking +# 括弧の数を引数にする +class Solution: + def generateParenthesis(self, n: int) -> List[str]: + def make_combination(current, remain_left, remain_right): + if remain_left == 0 and remain_right == 0: + parentheses.append(current) + return + if 0 < remain_left: + make_combination(current + "(", remain_left - 1, remain_right) + if remain_left < remain_right: + make_combination(current + ")", remain_left, remain_right - 1) + + parentheses = [] + make_combination("", n, n) + return parentheses diff --git a/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_3.py b/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_3.py new file mode 100644 index 0000000..f5a39b6 --- /dev/null +++ b/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_3.py @@ -0,0 +1,14 @@ +class Solution: + def generateParenthesis(self, n: int) -> List[str]: + def make_combination(current, remain_left, remain_right): + if remain_left == 0 and remain_right == 0: + parentheses.append(current) + return + if 0 < remain_left: + make_combination(current + "(", remain_left - 1, remain_right) + if remain_left < remain_right: + make_combination(current + ")", remain_left, remain_right - 1) + + parentheses = [] + make_combination("", n, n) + return parentheses diff --git a/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_4.py b/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_4.py new file mode 100644 index 0000000..c04cfd2 --- /dev/null +++ b/arai60/50-53_Greedy_Backtracking/53_22_Generate Parentheses/level_4.py @@ -0,0 +1,34 @@ +class Solution: + def generateParenthesis(self, n: int) -> List[str]: + stack = [("", n, n)] + parentheses = [] + while stack: + current, remain_left, remain_right = stack.pop() + if remain_left == 0 and remain_right == 0: + parentheses.append(current) + continue + if 0 < remain_left: + stack.append((current + "(", remain_left - 1, remain_right)) + if remain_left < remain_right: + stack.append((current + ")", remain_left, remain_right - 1)) + + return parentheses + + +# backtracking +# 関数内で使う変数は先に定義する +class Solution: + def generateParenthesis(self, n: int) -> List[str]: + parentheses = [] + + def make_combination(current, remain_left, remain_right): + if remain_left == 0 and remain_right == 0: + parentheses.append(current) + return + if 0 < remain_left: + make_combination(current + "(", remain_left - 1, remain_right) + if remain_left < remain_right: + make_combination(current + ")", remain_left, remain_right - 1) + + make_combination("", n, n) + return parentheses