Palindrome Partitioning II 题解
题目来源:Palindrome Partitioning II
>
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.
解题思路:
>
Calculate and maintain 2 DP states:
pal[i][j] , which is whether s[i..j] forms a pal
d[i], which is the minCut for s[i..n-1]
Once we comes to a pal[i][j]==true:
if j==n-1, the string s[i..n-1] is a Pal, minCut is 0, d[i]=0;
else: the current cut num (first cut s[i..j] and then cut the rest s[j+1...n-1]) is 1+d[j+1],
compare it to the exisiting minCut num d[i], repalce if smaller.
d[0] is the answer.
第一步还是跟Palindrome Partitioning一样,用DP,任意i-j组合先计算好是否是回文;
第二步仍用DP,dp[i]表示s[i, len-1]最少的minCut, 对每一个palindrome[i][j]为true的:
if j == len-1, 则 dp[i]=0;
else s要拆分为s[i, j], [j+1, len-1],当前cut数=1+dp[j+1], 所以dp[i] = std::min(dp[i], 1+dp[j+1])
当然这两步也可以合在一起. ref
int minCut(string s)
{
int n = s.length();
vector<vector<bool> > dp(n, vector<bool>(n, false));
for(int i = 0; i < n; i++)
dp[i][i] = true;
vector<int> cuts(n, 0);
for(int i = n-1; i >= 0; i--)
{
cuts[i] = n-i-1;
for(int j = i; j < n; j++)
{
if(s[i] == s[j] && ((i+1>j-1) || dp[i+1][j-1] ))
{
dp[i][j] = true;
if(j == n-1)
cuts[i] = 0;
else //cut s[:j][j+1:n]
cuts[i] = std::min(cuts[i], 1 + cuts[j+1]);
}
}
}
return cuts[0];
}
Last updated
Was this helpful?