本题源自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;
}