本题源自LeetCode
---------------------------------------------------------------------------------------
用动态规划的思想
1 用一个dp数组来存储子串(0,i)的最小切割次数,则最优解在dp[str.length()-1].
2 如果当前子串是回文则dp[i]=0;否则dp[i]=i;
3 对于i大于等于1 的子串,如果【0,i】不是回文,如果s.substring(j,i+1)(j<=i,即遍历i之前的每个子串)是回文时,dp[i] = min(dp[i], dp[j-1]+1);
4 否则s.substring(j,i+1)(j<=i)不是回文时,dp[i] = min(dp[i],dp[j-1]+i+1-j);
int minCut(string s) {
int len=s.length();
vector<int> dp(len,0);
for(int i=0;i<len;i++){
dp[i]=IsPalindRome(s.substr(0,i+1)) ? 0 : i;
if(dp[i]==0)
continue;
else{
for(int j=1;j<=i;j++){
if(IsPalindRome(s.substr(j,i-j+1)))
dp[i]=min(dp[i],dp[j-1]+1);
else{
dp[i]=min(dp[i],dp[j-1]+i-j+1);
}
}
}
}
return dp[len-1];
}
bool IsPalindRome(string str){
int end=str.length()-1;
int start=0;
while(start<end){
if(str[start]==str[end]){
start++;
end--;
}else{
return false;
}
}
return true;
}

本文介绍了一种使用动态规划解决LeetCode中字符串分割为回文子串问题的方法。通过一个dp数组存储子串(0,i)的最小切割次数,利用IsPalindrome函数检查子串是否为回文,并更新dp数组以找到最小切割次数。

403

被折叠的 条评论
为什么被折叠?



