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

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. Microsoft Project 使用教程

    Microsoft Project使用教程 一.新建项目 1. Project界面操作 "文件" -→ "新建" -→ "空白项目" 建议在 ...

  2. python 操作 ES 一、基础操作

    示例代码环境 python:3.8 es:7.8.0环境安装 pip install elasticsearch==7.8.0 from elasticsearch import Elasticsea ...

  3. 在axios拦截器js文件中无法使用vue-router问题

    如果在axios设置拦截器的js文件或者说在vue-router路由配置文件,配置好的路由文件以外的js文件中使用 import {useRouter} from 'vue-router' 系统不会默 ...

  4. cpp chrono basic

    // cpp 20 //c++ - Number of seconds since midnight - Stack Overflow //https://stackoverflow.com/ques ...

  5. start-stop服务器启动

    springBoot打成jar包扔到linux服务器 start.sh nohup java -Dfile.encoding=utf-8  -jar XXX-1.0-SNAPSHOT.jar > ...

  6. 蓝桥杯训练赛二-问题 B

    字符串的输入输出处理. 输入 第一行是一个正整数N,最大为100.之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000. 输出 先将输入中的前N行字符串(可能含有空格)原样 ...

  7. Linux安装证书

    Linux安装 vCenter root CA: 1.访问vCenter管理页面,下载"下载受信任的根 CA 证书" 2.压缩文件内带有数字作为扩展名(.0..1 等)的文件是根证 ...

  8. nginx 编译安装支持 upload progress module, upload module

    下载地址: wiki.nginx.org/HttpUploadModule wiki.nginx.org/HttpUploadProgressModule 下载后解压至:/usr/src/文件夹下,其 ...

  9. win10 python mysqlclient 安装问题 已解决

    用习惯了Linux   忽然换到win10 超级不习惯  今天下午就一个mysqlclient 安装弄了好长时间  ,最后发现是得改名  真是想爆粗口. 下面直接进入正题: 下载地址  https:/ ...

  10. 第14章 Windows管理规范

    第14章 Windows管理规范 我们一直期望但是又害怕写这一章.Windows管理规范(Windows Management Instrumentation,WMI)可能是微软提供给管理员使用最优秀 ...