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:
Input: "aab" Output: 1 Explanation: The palindrome partitioning ["aa","b"] could be produced using 1 cut.
题目求一个字符串最少分几次可以使得子串都是回文。
分治法思路。
- 如果str是回文。返回0
- 遍历 "str = 回文+childStr" 的所有可能。返回最优解 min(1 + minCut(childStr) ,....)。
显然,会有很多重复计算。我们缓存下结果。就可以得到DP解。代码如下(代码中被拆为childStr+回文):
int min(int i1, int i2){
return i1 < i2 ? i1 : i2;
}
int minCut(char* s) {
int l = strlen(s);
int dp[l];
bool palindromeStatus[l][l];
memset(palindromeStatus,0,sizeof(palindromeStatus));
for(int i = 0; i < l; ++i){
dp[i] = i;//最差不过是把所有字母都切开 长度-1
for(int j = 0; j <= i; ++j){
//检测剩余字符串是不是回文
if(i == j|| //单字符
(s[i] == s[j]
&&( i <= j+2 //中间为空或者单字符
|| palindromeStatus[i-1][j+1]))){//中间是回文
palindromeStatus[i][j] = true;
if(j == 0){
dp[i] = 0;
}else{
dp[i] = min(dp[i], dp[j-1] + 1);
}
}
}
}
return dp[l - 1];
}