【区间dp-回文-3】回文最少分割

同leet 132. 分割回文串 II

描述

给定一个字符串,返回把str全部切割成回文串的最少切割数。

输入描述:

输出包含一行字符串,代表str(1≤lengthstr≤5000)(1≤lengthstr​≤5000)

输出描述:

输出一个整数,代表把str全部切割成回文串的最小切割数。

示例1

输入:

ABA

输出:

0

说明:

本身是回文串,不需要切割,直接输出0

示例2

输入:

ABCBAEEE

输出:

1

说明:

切割1次,变为“ABCBA”和“EEE”

备注:

时间复杂度O(n2)O(n2),额外空间复杂度O(n2)O(n2)。

这个在用区间型动态规划构建dp[l][r]的基础上,同时也用上了划分型动态规划。简单来说从任何位置构建的回文子串可能不止有一个,当前位置dp答案可以由过去的多种方案的dp值推出来,取各次推出的最小值。

题目实际是想找字符串全部由回文子串 串联构成的 不重叠的 最少回文子串个数

分析:1)使用动态规划在构建dp[l][r]的时候会遇到s中所有回文子串。

2)用动态规划dp2[i]表示s字符串上[0,i-1]闭区间长度为i的字符串的答案--“所有可能的分割方案”分割出来的回文子串数量

3)当构建dp[l][r]时遇到回文子串的时候,可以推断:[0,r]区间长度为 r+1 的字符串对应结果:

dp2[r + 1] = Math.min( dp2[r + 1], dp2[l] + 1); //在dp2[l]的基础上增加1个回文子串

4) 另外dp2[r+1]初始值是dp2[r]+1, 长度为r的字符串增加1个字符变成长度为r的字符串,增加的1个字符构成1个回文子串

综上分析,代码如下:

     public int minCut(String str) {
        char[] s = str.toCharArray();
        int n = s.length;
        boolean[][] dp = new boolean[n][n];
        int[] dp2 = new int[n + 1];
        for (int r = 0; r < n; r++) {
            dp2[r + 1] = dp2[r] + 1;
            for (int l = r; l >= 0; l--) {
                if ( l == r || (s[l] == s[r] && (l + 1 == r || dp[l + 1][r - 1])) ) {
                    dp[l][r] = true;
                    dp2[r + 1] = Math.min( dp2[r + 1], dp2[l] + 1);
                }
            }
        }
        return dp2[n] - 1; //分割数=子串数量-1
    }
算法笔试-动态规划系列 文章被收录于专栏

动态规划相关算法笔试题

全部评论

相关推荐

金三银四就要来了,很多朋友可能都有求职、跳槽、找工作的打算,免不了要参加各种各样的面试。有些朋友明明很优秀,但因为面试时候太紧张,导致没有发挥好而错过很好的机会。分享一个能够帮助你在面试中减少紧张情绪的方法:反客为主。意思就是,不要把自己当作面试者,而要把自己当作面试官。大多数朋友在找工作的时候一个很常见的心态,就是非常希望应聘的公司能够给自己一个工作机会。这种心态当然没错,但如果心里总是期待着这个结果,很容易患得患失,在面试的时候也自然就会紧张。而如果你反过来想,这场面试不仅仅是公司在考察你,更是你近距离全面考察公司的机会:这家公司的业务到底行不行、未来的老板专业能力怎么样、管理风格又是怎样的、这个职位的工作内容具体是什么、对你的要求又是什么…这些都是你在面试中需要尽可能地去弄清楚的问题。千万不要看轻自己。你确实是在被公司挑选,你确实也希望自己能被面试官看中然后拿到这份工作,但这不是你需要特别关注的,更不是你能够控制的。对你来说,你更应该去关注的,是从自己出发,你是不是愿意和对面的这些人合作、这家公司是不是配得上你、是不是值得你短则一两年、长则三五年每天都在这里上班。这个方法的关键,就是把自己放在和公司平等的位置上。用这个心态去面试,不仅能有效缓解你的紧张,更能帮助你收集到更多对你有用的信息,更好地帮助你做出下一步决策。 #牛客激励计划# #牛客创作赏金赛#
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务