描述
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.
For example, given s = “aab”,
Return 1 since the palindrome partitioning [“aa”,”b”] could be produced using 1 cut.
分析
是上一题的升级版,要求找到最小划分。
采用动态规划法,设f(i, j)
为s[i:j+1]
之间最小的切割数,则有f(i, j) = min(f(i, k) + f(k + 1, j)), i<=k<=j
。可以把这个递推条件转化为一维的,另dp[i]
表示s[0:i]
的最小切割数,则dp[i] = min(dp[j] + 1), 0<=j<i
。 这个有点tricky,这样来想dp[j]
代表了前j个字符的最小割数,而dp[i]
(i > j)的就可以拆分成这些情况:
第i个字符自成一个回文,加上前i-1个字符的最小割数dp[i - 1] + 1
第i-1, i两个个字符成一个回文,加上前i-2个字符的最小割数dp[i - 2] + 1
...
第2, 3, ..., i个字符成一个回文,加上前1个字符的最小割数dp[1] + 1
前i个字符成一个回文,这个时候最小割数应该是0,因为不用切割,为了统一形式,我们令dp[0] = -1, 则可以写作dp[0] + 1
所有这些情况的最小值就是dp[i]
的值。
代码
Python
1 | class Solution(object): |