zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    人月神话阅读笔记03
    学习进度十六
    计算最长英语链
    学习进度十五
    人月神话阅读笔记02
    找“水王”
    学习进度十四
    用户体验评价
    学习进度十三
    学习进度十二
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/13554431.html
Copyright © 2011-2022 走看看