继续与动态规划斗智斗勇。。。

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的更多相关文章

  1. Java实现 LeetCode 132 分割回文串 II(二)

    132. 分割回文串 II 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一 ...

  2. Leetcode 132.分割回文串II

    分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s ...

  3. [LeetCode] 132. 分割回文串 II

    题目链接 : https://leetcode-cn.com/problems/palindrome-partitioning-ii/ 题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子 ...

  4. LeetCode 132. 分割回文串 II(Palindrome Partitioning II)

    题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s ...

  5. [Swift]LeetCode132. 分割回文串 II | Palindrome Partitioning II

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

  6. 分割回文串 II · Palindrome Partitioning II

    [抄题]: 给定一个字符串s,将s分割成一些子串,使每个子串都是回文. 返回s符合要求的的最少分割次数. [思维问题]: 不知道要用预处理字符串降低复杂度 [一句话思路]: 先把预处理获得s中回文串的 ...

  7. 132 Palindrome Partitioning II 分割回文串 II

    给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 符合要求的的最少分割次数.例如,给出 s = "aab",返回 1 因为进行一次分割可以将字符串 s 分 ...

  8. 132. 分割回文串 II

    Q: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: “aab” 输出: 1 解释: 进行一次分割就可将 s 分割成 [“aa”,“b ...

  9. leetcode 分割回文串

    这个方法有问题,这是计算所有子串组成的所有回文子串:而不是所有分割的回文子串: class Solution { public: vector<vector<string>> ...

  10. LeetCode 131. 分割回文串(Palindrome Partitioning)

    131. 分割回文串 131. Palindrome Partitioning 题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. LeetC ...

随机推荐

  1. 一些sql查询的case

    1.单列去重,输出去重后条目数量 select count(distinct(`id`)) from student; 2.根据分数段统计数据条目:利用case when selectcount(ca ...

  2. CAD梦想画图中的“绘图工具——多线段”

    CAD软件多线段命令是作为单个平面对象创建的相互连接的线段序列.可以创建直线段.圆弧段或两者的组合线段. 执行方式: (1)单击菜单栏"绘图→多线段".如图: (2)单击绘图工具栏 ...

  3. C++ primer 5th 第二章 变量和基本类型 阅读笔记

    第二章 变量和基本类型 第一节 基本内置类型 C++标准规定了算术类型尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸. 比如: 类型 含义 最小尺寸 bool 布尔类型 未定义 wchar_t 宽 ...

  4. ssl自动更新证书

    安装证书 yum install certbot 更新证书之前先开启80 443 端口 自动生成证书certbot certonly --standalone --agree-tos -n -d ww ...

  5. 《Vue.js 3.x高效前端开发(视频教学版)》简介

    #好书推荐##好书奇遇季#<Vue.js 3.x高效前端开发(视频教学版)>,京东当当天猫都有发售.本书配套示例源码.PPT课件.思维导图.数据集.开发环境与答疑服务. 本书通过对Vue. ...

  6. 关系型数据库,基表Guid 主键设值

    在我们开发过程,为了自动适应新增修改,可以对基表,Guid 类型进行如下设置: public bool IsTransient() {       return this.Id == Guid.Emp ...

  7. iptables(二)常用规则即操作示例

    常用规则示例 修改chain默认策略 #filter表在INPUT chain默认策略为ACCEPT[root@iptables_host02 ~]# iptables -nvL INPUTChain ...

  8. 解决每次centos7执行java --version git --version等命令时都要重新source /etc/profile后才能执行,否则找不到命令-转载

      linux mint 我们通常将环境变量设置在/etc/profile这个文件中,这个文件是全局的. /etc/profile:在登录时,操作系 统定制用户环境时使用的第一个文件 ,此文件为系统的 ...

  9. npm设置和取消代理的方法

    设置代理 npm config set proxy=http://server:port npm config set https-proxy https://server:port // https ...

  10. 【ADB命令】安装app

    在电脑上安装以下指令 adb install app的文件位置