From 841f73763cbc8a85f71563be796fd34c126b44db Mon Sep 17 00:00:00 2001 From: kosuri-indu Date: Fri, 6 Oct 2023 21:27:01 +0530 Subject: [PATCH 01/16] to add generate_parentheses.py --- backtracking/generate_parentheses.py | 58 ++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 backtracking/generate_parentheses.py diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py new file mode 100644 index 000000000000..e9c9988dabe0 --- /dev/null +++ b/backtracking/generate_parentheses.py @@ -0,0 +1,58 @@ +""" +Given 'n' pairs of parentheses, +this program generates all combinations of parentheses. + +Example, n = 3 : +[ + "((()))", + "(()())", + "(())()", + "()(())", + "()()()" +] + +This problem can be solved using the concept of "BACKTRACKING". + +By adding an open parenthesis to the solution and +recursively add more till we get 'n' open parentheses. + +Then we start adding close parentheses until the solution is valid +(open parenthesis is closed). + +If we reach a point where we can not add more parentheses to the solution, +we backtrack to the previous step and try a different path. +""" + +def generate_parentheses(n): + """ + + >>> generate_parentheses(3) + ['((()))', '(()())', '(())()', '()(())', '()()()'] + + >>> generate_parentheses(1) + ['()'] + + >>> generate_parentheses(0) + [''] + + """ + def backtrack(x='', left=0, right=0): + if len(x) == 2 * n: + sol.append(x) + return + if left < n: + backtrack(x+'(', left+1, right) + if right < left: + backtrack(x+')', left, right+1) + + sol = [] + backtrack() + return sol + +def main(): + print(generate_parentheses(3)) + +if __name__ == "__main__": + import doctest + doctest.testmod() + main() From e54401343e00f747f16c517e5b298a9fc18c1a38 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:03:02 +0000 Subject: [PATCH 02/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- backtracking/generate_parentheses.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index e9c9988dabe0..f94c409c779d 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -11,18 +11,19 @@ "()()()" ] -This problem can be solved using the concept of "BACKTRACKING". +This problem can be solved using the concept of "BACKTRACKING". -By adding an open parenthesis to the solution and -recursively add more till we get 'n' open parentheses. +By adding an open parenthesis to the solution and +recursively add more till we get 'n' open parentheses. -Then we start adding close parentheses until the solution is valid -(open parenthesis is closed). +Then we start adding close parentheses until the solution is valid +(open parenthesis is closed). If we reach a point where we can not add more parentheses to the solution, we backtrack to the previous step and try a different path. """ + def generate_parentheses(n): """ @@ -34,25 +35,29 @@ def generate_parentheses(n): >>> generate_parentheses(0) [''] - + """ - def backtrack(x='', left=0, right=0): + + def backtrack(x="", left=0, right=0): if len(x) == 2 * n: sol.append(x) return if left < n: - backtrack(x+'(', left+1, right) + backtrack(x + "(", left + 1, right) if right < left: - backtrack(x+')', left, right+1) + backtrack(x + ")", left, right + 1) sol = [] backtrack() return sol + def main(): print(generate_parentheses(3)) + if __name__ == "__main__": import doctest + doctest.testmod() main() From 1b085f01315a6b97f74bd4cc992b30c34a9d61b7 Mon Sep 17 00:00:00 2001 From: kosuri-indu Date: Fri, 6 Oct 2023 21:38:53 +0530 Subject: [PATCH 03/16] to add ->None --- backtracking/generate_parentheses.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index e9c9988dabe0..e87f85862f99 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -23,7 +23,7 @@ we backtrack to the previous step and try a different path. """ -def generate_parentheses(n): +def generate_parentheses(n)->None: """ >>> generate_parentheses(3) @@ -36,7 +36,7 @@ def generate_parentheses(n): [''] """ - def backtrack(x='', left=0, right=0): + def backtrack(x='', left=0, right=0)->None: if len(x) == 2 * n: sol.append(x) return @@ -49,7 +49,7 @@ def backtrack(x='', left=0, right=0): backtrack() return sol -def main(): +def main() -> None: print(generate_parentheses(3)) if __name__ == "__main__": From 5b96f96a31e5f6a783b3c3b62a9d7c5244fb87a5 Mon Sep 17 00:00:00 2001 From: kosuri-indu Date: Fri, 6 Oct 2023 21:40:11 +0530 Subject: [PATCH 04/16] to add ->None --- backtracking/generate_parentheses.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index fd901794cfd2..b7b2ddd0db35 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -37,7 +37,7 @@ def generate_parentheses(n)->None: [''] """ - def backtrack(x='', left=0, right=0): + def backtrack(x='', left=0, right=0)->None: if len(x) == 2 * n: sol.append(x) return @@ -50,7 +50,7 @@ def backtrack(x='', left=0, right=0): backtrack() return sol -def main(): +def main()->None: print(generate_parentheses(3)) From cfe859c5080d08923f1ff6d3ffcb10272cb2b1ec Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:12:56 +0000 Subject: [PATCH 05/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- backtracking/generate_parentheses.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index b7b2ddd0db35..398c24483a97 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -24,7 +24,7 @@ """ -def generate_parentheses(n)->None: +def generate_parentheses(n) -> None: """ >>> generate_parentheses(3) @@ -37,7 +37,8 @@ def generate_parentheses(n)->None: [''] """ - def backtrack(x='', left=0, right=0)->None: + + def backtrack(x="", left=0, right=0) -> None: if len(x) == 2 * n: sol.append(x) return @@ -50,7 +51,8 @@ def backtrack(x='', left=0, right=0)->None: backtrack() return sol -def main()->None: + +def main() -> None: print(generate_parentheses(3)) From 583e8d353fe37d4ecb80ea56fee071404ce7006c Mon Sep 17 00:00:00 2001 From: kosuri-indu Date: Fri, 6 Oct 2023 21:48:42 +0530 Subject: [PATCH 06/16] to remove ->None --- backtracking/generate_parentheses.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index 398c24483a97..f94c409c779d 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -24,7 +24,7 @@ """ -def generate_parentheses(n) -> None: +def generate_parentheses(n): """ >>> generate_parentheses(3) @@ -38,7 +38,7 @@ def generate_parentheses(n) -> None: """ - def backtrack(x="", left=0, right=0) -> None: + def backtrack(x="", left=0, right=0): if len(x) == 2 * n: sol.append(x) return @@ -52,7 +52,7 @@ def backtrack(x="", left=0, right=0) -> None: return sol -def main() -> None: +def main(): print(generate_parentheses(3)) From e753986b26887bee2d24afca8fe1f4decd127a99 Mon Sep 17 00:00:00 2001 From: kosuri-indu Date: Fri, 6 Oct 2023 21:56:07 +0530 Subject: [PATCH 07/16] changes --- backtracking/generate_parentheses.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index f94c409c779d..aff06ede94e8 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -24,7 +24,7 @@ """ -def generate_parentheses(n): +def generate_parentheses(number : int): """ >>> generate_parentheses(3) @@ -37,25 +37,25 @@ def generate_parentheses(n): [''] """ - - def backtrack(x="", left=0, right=0): - if len(x) == 2 * n: - sol.append(x) + + def backtrack(x="",left=0,right=0 ): + + if len(x) == 2 * number: + result.append(x) return - if left < n: + if left < number: backtrack(x + "(", left + 1, right) if right < left: backtrack(x + ")", left, right + 1) - sol = [] + result = [] backtrack() - return sol + return result def main(): print(generate_parentheses(3)) - if __name__ == "__main__": import doctest From 9f847d6da03579dcabc913fb5dda5bdd470eaabc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:26:50 +0000 Subject: [PATCH 08/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- backtracking/generate_parentheses.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index aff06ede94e8..3bd895a680c1 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -24,7 +24,7 @@ """ -def generate_parentheses(number : int): +def generate_parentheses(number: int): """ >>> generate_parentheses(3) @@ -37,9 +37,8 @@ def generate_parentheses(number : int): [''] """ - - def backtrack(x="",left=0,right=0 ): - + + def backtrack(x="", left=0, right=0): if len(x) == 2 * number: result.append(x) return @@ -56,6 +55,7 @@ def backtrack(x="",left=0,right=0 ): def main(): print(generate_parentheses(3)) + if __name__ == "__main__": import doctest From 63052db2be15aeb3a6d3aa3d5d00a5e6ff5130d5 Mon Sep 17 00:00:00 2001 From: kosuri-indu Date: Fri, 6 Oct 2023 21:59:11 +0530 Subject: [PATCH 09/16] changes --- backtracking/generate_parentheses.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index aff06ede94e8..f91aee6633ad 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -24,7 +24,7 @@ """ -def generate_parentheses(number : int): +def generate_parentheses(number : int = 3): """ >>> generate_parentheses(3) @@ -38,7 +38,7 @@ def generate_parentheses(number : int): """ - def backtrack(x="",left=0,right=0 ): + def backtrack(x : str = "",left : int = 0, right : int = 0 ): if len(x) == 2 * number: result.append(x) @@ -52,12 +52,8 @@ def backtrack(x="",left=0,right=0 ): backtrack() return result - -def main(): - print(generate_parentheses(3)) - if __name__ == "__main__": import doctest doctest.testmod() - main() + print(f"{generate_parentheses() = }") \ No newline at end of file From 9c09f35e6e81cd6d87bb1e84ed9106f83063eea2 Mon Sep 17 00:00:00 2001 From: kosuri-indu Date: Fri, 6 Oct 2023 22:01:05 +0530 Subject: [PATCH 10/16] changes --- backtracking/generate_parentheses.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index f3b876a66e6b..09af655e8d07 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -24,7 +24,7 @@ """ -def generate_parentheses(number : int): +def generate_parentheses(number : int = 3): """ >>> generate_parentheses(3) @@ -38,7 +38,7 @@ def generate_parentheses(number : int): """ - def backtrack(x="",left=0,right=0 ): + def backtrack(x : str = "", left : int = 0, right : int = 0): if len(x) == 2 * number: result.append(x) @@ -52,10 +52,6 @@ def backtrack(x="",left=0,right=0 ): backtrack() return result - -def main(): - print(generate_parentheses(3)) - if __name__ == "__main__": import doctest From 087ede306855dd4266ade38ceee919336572ce68 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:31:56 +0000 Subject: [PATCH 11/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- backtracking/generate_parentheses.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index 09af655e8d07..80ee6961378d 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -24,7 +24,7 @@ """ -def generate_parentheses(number : int = 3): +def generate_parentheses(number: int = 3): """ >>> generate_parentheses(3) @@ -37,9 +37,8 @@ def generate_parentheses(number : int = 3): [''] """ - - def backtrack(x : str = "", left : int = 0, right : int = 0): - + + def backtrack(x: str = "", left: int = 0, right: int = 0): if len(x) == 2 * number: result.append(x) return @@ -52,8 +51,9 @@ def backtrack(x : str = "", left : int = 0, right : int = 0): backtrack() return result + if __name__ == "__main__": import doctest doctest.testmod() - print(f"{generate_parentheses() = }") \ No newline at end of file + print(f"{generate_parentheses() = }") From 686bfa9edd9a82cbe5fd0299a436bf8f4bb4006b Mon Sep 17 00:00:00 2001 From: kosuri-indu Date: Fri, 6 Oct 2023 22:08:41 +0530 Subject: [PATCH 12/16] changes --- backtracking/generate_parentheses.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index 09af655e8d07..f89dd790275f 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -24,12 +24,15 @@ """ -def generate_parentheses(number : int = 3): +def generate_parentheses(number : int = 0) -> list: """ >>> generate_parentheses(3) ['((()))', '(()())', '(())()', '()(())', '()()()'] + >>> generate_parentheses(3) + ['(())', '()()'] + >>> generate_parentheses(1) ['()'] @@ -38,7 +41,7 @@ def generate_parentheses(number : int = 3): """ - def backtrack(x : str = "", left : int = 0, right : int = 0): + def backtrack(x : str = "", left : int = 0, right : int = 0) -> None: if len(x) == 2 * number: result.append(x) From 9100faf844ff05c1b05f247ddd341cbafbaaea62 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:40:36 +0000 Subject: [PATCH 13/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- backtracking/generate_parentheses.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index d14aeaaf01e3..32124ee15993 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -24,7 +24,7 @@ """ -def generate_parentheses(number : int = 3): +def generate_parentheses(number: int = 3): """ >>> generate_parentheses(3) @@ -40,9 +40,8 @@ def generate_parentheses(number : int = 3): [''] """ - - def backtrack(x : str = "", left : int = 0, right : int = 0): - + + def backtrack(x: str = "", left: int = 0, right: int = 0): if len(x) == 2 * number: result.append(x) return From c05de071f049b47eb1f11e7f1be3c7f49acb032a Mon Sep 17 00:00:00 2001 From: kosuri-indu Date: Fri, 6 Oct 2023 22:16:16 +0530 Subject: [PATCH 14/16] changes --- backtracking/generate_parentheses.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index d14aeaaf01e3..68644715fa9a 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -1,7 +1,6 @@ """ Given 'n' pairs of parentheses, this program generates all combinations of parentheses. - Example, n = 3 : [ "((()))", @@ -10,23 +9,17 @@ "()(())", "()()()" ] - This problem can be solved using the concept of "BACKTRACKING". - By adding an open parenthesis to the solution and recursively add more till we get 'n' open parentheses. - Then we start adding close parentheses until the solution is valid (open parenthesis is closed). - If we reach a point where we can not add more parentheses to the solution, we backtrack to the previous step and try a different path. """ - -def generate_parentheses(number : int = 3): +def generate_parentheses(number : int = 3) -> list: """ - >>> generate_parentheses(3) ['((()))', '(()())', '(())()', '()(())', '()()()'] @@ -38,10 +31,8 @@ def generate_parentheses(number : int = 3): >>> generate_parentheses(0) [''] - """ - - def backtrack(x : str = "", left : int = 0, right : int = 0): + def backtrack(x : str = "", left : int = 0, right : int = 0) -> None: if len(x) == 2 * number: result.append(x) @@ -55,7 +46,6 @@ def backtrack(x : str = "", left : int = 0, right : int = 0): backtrack() return result - if __name__ == "__main__": import doctest From aaa803a8dbedd3e38d9d34c604d89cce2843c476 Mon Sep 17 00:00:00 2001 From: kosuri-indu Date: Fri, 6 Oct 2023 22:17:02 +0530 Subject: [PATCH 15/16] changes --- backtracking/generate_parentheses.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index cbfb360ba84a..261d69af2f66 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -19,7 +19,7 @@ """ -def generate_parentheses(number : int = 3): +def generate_parentheses(number : int = 3) -> list: """ >>> generate_parentheses(3) ['((()))', '(()())', '(())()', '()(())', '()()()'] @@ -34,7 +34,7 @@ def generate_parentheses(number : int = 3): [''] """ - def backtrack(x : str = "", left : int = 0, right : int = 0): + def backtrack(x : str = "", left : int = 0, right : int = 0) -> None: if len(x) == 2 * number: result.append(x) From 5ddbff07d8fb5df034cc8e3b003b184ed0bd8b92 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:47:44 +0000 Subject: [PATCH 16/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- backtracking/generate_parentheses.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backtracking/generate_parentheses.py b/backtracking/generate_parentheses.py index 261d69af2f66..829957ab26ec 100644 --- a/backtracking/generate_parentheses.py +++ b/backtracking/generate_parentheses.py @@ -19,7 +19,7 @@ """ -def generate_parentheses(number : int = 3) -> list: +def generate_parentheses(number: int = 3) -> list: """ >>> generate_parentheses(3) ['((()))', '(()())', '(())()', '()(())', '()()()'] @@ -33,9 +33,8 @@ def generate_parentheses(number : int = 3) -> list: >>> generate_parentheses(0) [''] """ - - def backtrack(x : str = "", left : int = 0, right : int = 0) -> None: - + + def backtrack(x: str = "", left: int = 0, right: int = 0) -> None: if len(x) == 2 * number: result.append(x) return @@ -48,6 +47,7 @@ def backtrack(x : str = "", left : int = 0, right : int = 0) -> None: backtrack() return result + if __name__ == "__main__": import doctest