您的位置:首页 > 其它

将一个字符串s 切割成子串都是回文,最小的切割次数

2017-10-07 11:04 369 查看
本题源自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+
[code]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)))
4000
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐