Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
"""Palindrome partitioning module.

Given a string s, partition s such that every substring of the partition is a palindrome.

Check failure on line 3 in dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py:3:89: E501 Line too long (89 > 88)
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

Check failure on line 10 in dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (UP035)

dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py:10:1: UP035 `typing.Tuple` is deprecated, use `tuple` instead

Check failure on line 10 in dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (UP035)

dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py:10:1: UP035 `typing.List` is deprecated, use `list` instead


def find_minimum_partitions(
s: str, return_partitions: bool = False
) -> Union[int, Tuple[int, List[str]]]:

Check failure on line 15 in dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (UP006)

dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py:15:28: UP006 Use `list` instead of `List` for type annotation

Check failure on line 15 in dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (UP006)

dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py:15:17: UP006 Use `tuple` instead of `Tuple` for type annotation

Check failure on line 15 in dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (UP007)

dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py:15:6: UP007 Use `X | Y` for type annotations
"""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] = []

Check failure on line 45 in dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (UP006)

dynamic_programming/better_palindrome_partitioning/palindrome_partitioning.py:45:17: UP006 Use `list` instead of `List` for type annotation
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))
Loading