【LeetCode】——分割回文串II
继续与动态规划斗智斗勇。。。
132. 分割回文串 II - 力扣(LeetCode) (leetcode-cn.com)


分析:记f[i]表示将字符串s[0:i]分割的最小次数。我们需要将列举出在[0:i]内的最大回文串数。我们可以列举出最后一个回文串s[j+1:i],那么f[i]就可以写出:
f[i]=min(f[j])+1;
我们还要再考虑一种情况:s[0:i]是一个回文串,此时不需要任何分割,即f[i]=0。
那么,问题就转到了如何确定s[0:i]中的回文串数目。我们可以再用一次动态规划来解决这个问题:
设g[i][j]表示s[i:j]是否为回文串,那么其状态转移方程为:

class Solution {
public:
    int minCut(string s) {
        int n=s.length();
        vector<vector<bool>> g(n,vector<bool>(n,true));
        for(int i=n-1;i>=0;i--){
            for(int j=i+1;j<n;j++){
                g[i][j]=(s[i]==s[j])&&g[i+1][j-1];
            }
        }
        vector<int> f(n,INT_MAX);
        for(int i=0;i<n;i++){
            if(g[0][i]){
                f[i]=0;
            }
            else{
                for(int j=0;j<i;++j){
                    if(g[j+1][i]){
                        f[i]=min(f[i],f[j]+1);
                    }
                }
            }
        }
        return f[n-1];
    }
};代码中还有一些细节值得我们注意:
比如这里:

为什么我们需要从后往前遍历?我刚开始写的时候是从前往后的,跑不通。仔细想想才发现,我们需要用到后一行的状态信息g[i+1][j-1],如果从前往后遍历的话,g[i+1][j-1]是未更新过的初始化量true,那么就存在一种可能:s[i]==s[j],但s[i+1,j-1]不是回文串,g[i+1][j-1]此时却为true,导致最终结果有误。所以在动态规划问题中遍历方向一定要看我们需要用到之前的状态还是之后的状态,如果是之前的我们就可以从前往后遍历,如果要用到后一行的状态那么我们就需要从后往前遍历,这一点在背包问题的状态压缩写法中也有所体现。
【LeetCode】——分割回文串II的更多相关文章
- Java实现 LeetCode 132 分割回文串 II(二)
		132. 分割回文串 II 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一 ... 
- Leetcode 132.分割回文串II
		分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s ... 
- [LeetCode] 132. 分割回文串 II
		题目链接 : https://leetcode-cn.com/problems/palindrome-partitioning-ii/ 题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子 ... 
- LeetCode 132. 分割回文串 II(Palindrome Partitioning II)
		题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s ... 
- [Swift]LeetCode132. 分割回文串 II | Palindrome Partitioning II
		Given a string s, partition s such that every substring of the partition is a palindrome. Return the ... 
- 分割回文串 II · Palindrome Partitioning II
		[抄题]: 给定一个字符串s,将s分割成一些子串,使每个子串都是回文. 返回s符合要求的的最少分割次数. [思维问题]: 不知道要用预处理字符串降低复杂度 [一句话思路]: 先把预处理获得s中回文串的 ... 
- 132 Palindrome Partitioning II 分割回文串 II
		给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 符合要求的的最少分割次数.例如,给出 s = "aab",返回 1 因为进行一次分割可以将字符串 s 分 ... 
- 132. 分割回文串 II
		Q: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: “aab” 输出: 1 解释: 进行一次分割就可将 s 分割成 [“aa”,“b ... 
- leetcode 分割回文串
		这个方法有问题,这是计算所有子串组成的所有回文子串:而不是所有分割的回文子串: class Solution { public: vector<vector<string>> ... 
- LeetCode 131. 分割回文串(Palindrome Partitioning)
		131. 分割回文串 131. Palindrome Partitioning 题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. LeetC ... 
随机推荐
- 安装nginx依赖库
			nginx安装headers-more-nginx-module,推荐下面这篇贴,步骤简洁明了,本人ubutu18.0.04版本一次性安装成功: https://www.jianshu.com/p/8 ... 
- vue 定时器 定时刷新页面 定时请求接口
			data(){ return{ intervalId:null, } }, methods:{ // 定时刷新数据函数 dataRefreh() { // 计时器正在进行中,退出函数 if (this ... 
- Wix Setting language and code page attributes
			When you localize your MSI package, you'll need to alter your Productand Package elements to suit. T ... 
- JSONObject和JSONArray的区别
			JSONObject是用{}表示: JSONArray是用[]表示,相当于[{ }, { }],是由JSONObject的集合. 定义一个String类型 JSONObject jsonOject = ... 
- NLB+ARR实现IIS下的高可用性负载均衡
			NLB+ARR实现IIS下的高可用性负载均衡 场景: 高可用/可伸缩集群: NLB部署: 很简单, 暂略. 3.ARR部署 ARR全称叫Application Request Router, 是I ... 
- vue 图片下载
			getBase64Image(img) { var canvas = document.createElement("canvas"); canv ... 
- kernel32.dll函数简介
			kernel32.dll是非常重要的32位动态链接库文件,属于内核级文件.它控制着系统的内存管理.数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保 ... 
- linux 安装 talib 的完美姿势!
			安装 TA-Lib $ wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz $ tar -zxvf ta-li ... 
- java hibernate +mysql demo
			origin article:http://www.javatpoint.com/example-to-create-hibernate-application-in-eclipse-ide requ ... 
- hierarchical-clustering
			https://ww2.mathworks.cn/help/stats/hierarchical-clustering.html https://ww2.mathworks.cn/help/stats ... 
