每日AC-LeetCode-palindrome-partitioning-ii --动态规划

每日AC-LeetCode-palindrome-partitioning-ii --动态规划



题目描述


Given a string s, partition s such that every substring of the partition is a palindrome.

Return the minimum cuts needed for a palindrome partitioning of s.

For example, given s ="aab",
Return1since the palindrome partitioning["aa","b"]could be produced using 1 cut.




还是动态规划的思想,缩小规模,确认状态转换方程

难点是如何获得当前最小的切割数,这个理解上有难点,注释里面稍微做了解释




AC 代码:


/**
 * 类说明
 * 
 * <pre>
 * Modify Information:
 * Author        Date          Description
 * ============ =========== ============================
 * DELL          2017年9月11日    Create this file
 * </pre>
 * 
 */

public class PalindromePartitioning {

    public int minCut(String s) {
     // 动态规划的思想  是缩小规模
     // 确定状态转移方程
        
     /**
      * 状态转移方程:
      * dp[j] 表示s.subStr(0,j)是 回文的最小切割次数
      * min = dp[i] 表示dp[i] s.subStr(0,i) 回文最小切割次数
      * dp[i] = Math.min(min, dp[j] +1) 表示的是从j 到 i 只要一刀(肯定是最小的) 可以分割出一个回文了 即表示从i前面找到j 
      * j到i之间只要一刀,肯定是最少的,就一刀
      * 
      * 规模缩小了,只要计算dp[j]的最小分割次数就可以
      * 
      * 意思是什么来着 j ~ i 要找到dp[i] 最小的回文次数,先找到i 前面里 i 最近的回文
      * 例如 abcbc
      * dp[1]  小字符串a  本身就是个回文 b前面要切 1刀 有个回文串a;
      * dp[2]  ab      c前面最近的回文串b是 min = d[1] +1  b之前的回文串是a  这切2刀,没有其他的了
      * dp[3] abc   d前面 c是回文字符串 min= dp[2]+1 前面没有其他回文字符串了 = 3
      * dp[4] abcb c前面的回文字符串是b  min = dp[3]+1=4  但是继续遍历看前面还有没有回文串 
      *  cb,bcb,bcbc 发现有一个c前面还有一个字符串,发现bcbc前面的回文切割最小是dp[1]= 1, 
      *  那么最后结果就知道了= 2比min小啊,那就是min,字符串末尾切一刀就可以,由于是切一刀 那么结果必须-1
      */
     int[] dp  =  new int[s.length()+1];
     //最后一刀不要切 //也可以dp 默认全是 0 最后 dp[s.length()]-1也可
     dp[0] = -1;
     for(int i = 1; i <= s.length(); i++){
         // 表示第i次最小的切割次数
         int min = Integer.MAX_VALUE;
         //缩小规模
         for(int j = i-1; j >=0 ; j--){
             // 如果一刀搞定 即j ~ i 之间是回文
             if(isPalindrome(s.substring(j, i)) && dp[j]+1 < min ){
                 min = dp[j]+1;
             }
             //不是回文,继续 当i = s.length()时候 min 就是整个字符中最小的了
         }
         dp[i] = min;
     }
     return dp[s.length()];
    }

    /**
     * 判断回文字符串
     * @param str
     * @return
     */
    public boolean isPalindrome(String str) {
        boolean result = true;
        for (int i = 0, j = str.length() - 1; i < j; i++, j--) {
            if (str.charAt(i) != str.charAt(j)) {
                result = false;
                break;
            }
        }
        return result;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        String str ="aabcddcb";
        int ans = new PalindromePartitioning().minCut(str);
        System.out.println(ans);
    }

}




wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付 19.89元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值