Given a string s
, partition s
such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s
.
Example 1:
Input: s = "aab" Output: 1 Explanation: The palindrome partitioning ["aa","b"] could be produced using 1 cut.
Example 2:
Input: s = "a" Output: 0
Example 3:
Input: s = "ab" Output: 1
Constraints:
1 <= s.length <= 2000
s
consists of lowercase English letters only.This problem asks for the minimum number of cuts needed to partition a given string s
into substrings that are all palindromes. The solution uses dynamic programming to efficiently solve this.
Approach:
The core idea is to build a table g
that indicates whether a substring is a palindrome. Then, a second table f
stores the minimum cuts needed to partition the string up to a given index.
Palindrome Check (g
table): A boolean table g[i][j]
is created, where g[i][j]
is true
if the substring s[i...j]
is a palindrome, and false
otherwise. This is efficiently computed using a bottom-up approach. A substring is a palindrome if its first and last characters are equal, and the inner substring is also a palindrome.
Minimum Cuts (f
table): An integer array f[i]
stores the minimum number of cuts needed to partition the substring s[0...i]
. We initialize f[i] = i
because in the worst case, we need i
cuts (cutting between each character).
Dynamic Programming Iteration: The algorithm iterates through the string. For each index i
, it checks all possible partitions ending at i
. If a substring s[j...i]
is a palindrome (g[j][i] == true
), then the minimum cuts needed to partition s[0...i]
is the minimum of its current value f[i]
and 1 + f[j-1]
(one cut to separate s[0...j-1]
from s[j...i]
). If j
is 0, it means the entire substring is a palindrome from the start, so f[i]
will be 0.
Result: Finally, f[n-1]
(where n
is the length of the string) will contain the minimum number of cuts needed to partition the entire string s
.
Time Complexity: O(n^2), where n is the length of the string. This is due to the nested loops used to fill the g
and f
tables.
Space Complexity: O(n^2), dominated by the g
table.
Code Explanations (Python Example):
class Solution:
def minCut(self, s: str) -> int:
n = len(s)
g = [[True] * n for _ in range(n)] # Initialize g table with True (single characters are palindromes)
# Fill g table: Check for palindromes
for i in range(n - 1, -1, -1):
for j in range(i + 1, n):
g[i][j] = s[i] == s[j] and g[i + 1][j - 1]
f = list(range(n)) # Initialize f table with worst-case cuts
# Fill f table using dynamic programming
for i in range(1, n):
for j in range(j, i + 1): # Iterate through possible partition points
if g[j][i]:
f[i] = min(f[i], 1 + f[j - 1] if j else 0) # Update minimum cuts
return f[-1] # Result is the minimum cuts for the entire string
The other language examples follow the same algorithm and logic, just using the respective language's syntax and data structures. The core idea of building the g
and f
tables remains the same across all implementations.