From bf994d7ae1d259f510ceebb02b79aae5ac103be0 Mon Sep 17 00:00:00 2001 From: Gunish Mukherji Date: Sat, 25 Oct 2025 02:42:42 +0530 Subject: [PATCH 1/2] =?UTF-8?q?feat(dp):=20palindrome=20partitioning=20-?= =?UTF-8?q?=20minimum=20cuts=20(O(n=C2=B2))?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dynamic programming solution - Returns minimum cuts + one valid partition - No tests in this PR (will follow up) --- .../__init__.py | 0 .../palindrome_partitioning.py | 63 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 dynamic_programming/better_palindrome_partitioning/__init__.py create mode 100644 dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py diff --git a/dynamic_programming/better_palindrome_partitioning/__init__.py b/dynamic_programming/better_palindrome_partitioning/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py b/dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py new file mode 100644 index 000000000000..378516e462a8 --- /dev/null +++ b/dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py @@ -0,0 +1,63 @@ +"""Palindrome partitioning module. + +Given a string s, partition s such that every substring of the partition is a palindrome. +Find the minimum cuts needed for a palindrome partitioning of s. + +Time complexity: O(n^2) +Space complexity: O(n^2) [can be optimized to O(n)] +""" + +from typing import List, Tuple, Union + + +def find_minimum_partitions( + s: str, return_partitions: bool = False +) -> Union[int, Tuple[int, List[str]]]: + """Return minimum cuts and optionally one valid partitioning.""" + n = len(s) + if n <= 1 or s == s[::-1]: + return (0, [s]) if return_partitions else 0 + + # DP tables + cuts = [0] * n + is_palindrome = [[False] * n for _ in range(n)] + parent = [-1] * n # tracks where to jump back for reconstruction + + for i in range(n): + min_cuts = i + for j in range(i + 1): + if s[j] == s[i] and (i - j <= 1 or is_palindrome[j + 1][i - 1]): + is_palindrome[j][i] = True + if j == 0: + min_cuts = 0 + parent[i] = -1 + else: + candidate = cuts[j - 1] + 1 + if candidate < min_cuts: + min_cuts = candidate + parent[i] = j - 1 + cuts[i] = min_cuts + + if not return_partitions: + return cuts[-1] + + # Reconstruct one valid partitioning + partitions: List[str] = [] + i = n - 1 + while i >= 0: + start = parent[i] + 1 if parent[i] != -1 else 0 + partitions.append(s[start:i + 1]) + if parent[i] == -1: + break + i = parent[i] + + partitions.reverse() + return (cuts[-1], partitions) + + +if __name__ == "__main__": + s = input("enter the string:").strip() + cuts, partitions = find_minimum_partitions(s, return_partitions=True) + print(f"Minimum cuts required: {cuts}") + print("One possible palindrome partitioning:") + print(" | ".join(partitions)) \ No newline at end of file From 3b8e49a511eb18637700a37d92b720b79e0c35d5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 24 Oct 2025 21:24:11 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../better_palindrome_partitioning/palindrome_partitioning.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py b/dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py index 378516e462a8..ea2fccec5dbc 100644 --- a/dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py +++ b/dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py @@ -46,7 +46,7 @@ def find_minimum_partitions( i = n - 1 while i >= 0: start = parent[i] + 1 if parent[i] != -1 else 0 - partitions.append(s[start:i + 1]) + partitions.append(s[start : i + 1]) if parent[i] == -1: break i = parent[i] @@ -60,4 +60,4 @@ def find_minimum_partitions( cuts, partitions = find_minimum_partitions(s, return_partitions=True) print(f"Minimum cuts required: {cuts}") print("One possible palindrome partitioning:") - print(" | ".join(partitions)) \ No newline at end of file + print(" | ".join(partitions))