PalindromePartitioningLi

来源:互联网 发布:文明5 mac 语言 编辑:程序博客网 时间:2024/06/05 05:18
1.问题描述:
给定一个字符串s,进行最少的分割,使得每个分割的子串都是回文串
2.解题思路:
动态回归算法的最优问题是找到从0~n-1的最少分割
1)最优子问题描述:找到从i~n-1的最少分割,用dp[i]表示
2)递归表示最优子结构:dp[i]=min{dp[j+1]+1} i<=j<len
3)  自顶向下表示最优解即dp[0]
for(int i=len-1;i>=0;i++){
dp[i]=Integer.MaxValue;
for(int j=i;j<len;j++){ //只有当i~j是回文串时,才更新dp[i]
if(s.charAt(i)==s.charAt(j) && (j-i<2 || p[i+1][j-1]==true)){
p[i][j]=true;
dp[i]=Math.min{dp[i],dp[j+1]+1};
}
}
}
3.程序源码:
public int minCut(String s) {
        int []dp=new int[s.length()+1];
        boolean [][]p=new boolean[s.length()][s.length()];
        dp[s.length()]=-1;//确保dp[s.length()-1]=0
        for(int i=s.length()-1;i>=0;i--){
            dp[i]=Integer.MAX_VALUE;
            for(int j=i;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j) && (j-i<2||p[i+1][j-1])){
                    p[i][j]=true;
                    dp[i]=Math.min(dp[i],dp[j+1]+1);
                }
            }
        }
        return dp[0];
    }



原创粉丝点击