zoukankan      html  css  js  c++  java
  • 动态规划之132 Palindrome Partitioning II

    题目链接:https://leetcode-cn.com/problems/palindrome-partitioning-ii/description/

    参考链接:https://blog.csdn.net/jingsuwen1/article/details/51934277

    dp[i]存放[0,i)即以前i个字符串的子串的最小切割数,则所求为dp[s.length()];

    前0个字符串和1个字符串不需要切割,所以dp[0]=0,dp[1]=0;

    1.初始化:当字串s.substring(0,i)([0,i)个字符)是回文时,dp[i] = 0(表示不需要分割);否则,dp[i] = i-1(表示至多分割i-1次);

    比如abc最多切割2次(a|b|c),aa不需要切割
    2.对于任意大于1的i,如果s.substring(j,i)( 1 =< j <=  i ,即遍历i之前的每个子串)是回文时,dp[i] = min(dp[i], dp[j]+1);
       (注:j不用取0是因为若j == 0,则又表示判断(0,i))。

    public int minCut(String s) {
            if(s == null||s.length() == 0)
                return 0;
            int[] dp=new int[s.length()+1];
            dp[0]=0;//空字符,不需要切割
            dp[1]=0;
            for (int i = 2; i < dp.length; i++) {
                dp[i]=is_palindrome(s.substring(0,i))?0:i-1;
            }
            for(int i=2;i<=s.length();i++)
            {
                //  1=<j<=i的子串回文判定
                for(int j=i;j>=1;j--)
                {
                    if(is_palindrome(s.substring(j,i)))
                    {
                        dp[i]=Math.min(dp[i],dp[j]+1);
                    }
                }
            }
            return dp[s.length()];
        }
        //判断回文串例程
        public boolean is_palindrome(String s)
        {
            //System.out.println(s);
            StringBuilder sb=new StringBuilder(s);
            return s.equals(sb.reverse().toString());
        }

     上述的dp方法在leetcdoe上显示超时,在牛客网上可以通过。所以期待更加完全的dp方法。

    加油啦!加油鸭,冲鸭!!!
  • 相关阅读:
    Java正則表達式入门
    Android
    centos改动sshport
    【iOS开发-59】LOL案例:单组tabView、alertView样式、实现监听,以及用reloadData数据刷新
    【Allwinner ClassA20类库分析】4.GPIO类的使用
    MvvmLight框架使用入门(四)
    MvvmLight框架使用入门(三)
    MvvmLight框架使用入门(二)
    MvvmLight框架使用入门(一)
    CEF 框架使用集锦
  • 原文地址:https://www.cnblogs.com/clarencezzh/p/10144709.html
Copyright © 2011-2022 走看看