Java给定一个字符串,分割字符串使得每个子字符串都是回文串,求最少分割次数

//dp[i]是回文就是0,否则就是Math.min(dp[j]+(j+1到i之间是不是回文?0:它需要分割的最小次数)+1);
当前dp[i]

图片中应该是Math.min(),我着急写成max了,大家注意啊!
1.若是回文串,则分割大小为0
2.若不是回文串,则默认大小给它的索引i,代表每一个词分一次,这是最差的分割,也就是这段区间能分割的最大次数
3.如图:

 4.如图:

 

 5.一直滑到i的前一个,如图:

 

 求出dp[i]的最小值,依次类推,知道求出最后的dp[len-1]也就是0~len-1也就是str的最小分割次数了

 private int getSplit2PalindromeMinCount(String str){
        //dp[i]是回文就是0,否则就是Math.min(dp[j]+(j+1到i之间是不是回文?:0:)+1);
        //dp[i]表示0~i最小的切割次数
        int len=str.length();
        int[] dp=new int[len];
        for (int i = 0; i < len; i++) {
            dp[i]=isPalindrome(str.substring(0,i+1))?0:i;
            if(dp[i]==0)continue;
            for(int j=0;j<i;j++){
                String s=str.substring(j+1,i+1);
                if(isPalindrome(s)){
                    dp[i]=Math.min(dp[i],dp[j]+1);
                }
                else {
                    dp[i]=Math.min(dp[i],dp[j]+1+getSplit2PalindromeMinCount(s));
                }
            }
        }
        return dp[len-1];
    }
    private boolean isPalindrome(String str){
        int len=str.length();
        int l=0,r=len-1;
        while (l<=r){
            if(str.charAt(l)!=str.charAt(r))return false;
            l++;r--;
        }
        return true;
    }
View Code
原文地址:https://www.cnblogs.com/ningxinjie/p/13554431.html