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

来源:互联网 发布:学设计软件计划 编辑:程序博客网 时间:2024/06/10 23:57

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


原创粉丝点击