【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 ...
随机推荐
- (0720) 【 表示 n'b0; 】
注意 花括号: (n+1)'b1 小括号:
- Camstar配置Audit Trail
- JSONObject没有parseObject方法
一定是你引入的包不对,你把上面的import 删掉,重新导入包就可以了. 在这之前加入依赖: ` net.sf.json-lib json-lib 2.4 <dependency> < ...
- selenium grid4.0+分布式的部署配置(hub/node方式)
一.grid安装 本文已jar包的方式讲解,访问并下载jar包:Releases · SeleniumHQ/selenium · GitHub 二.grid配置 假设主机:10.1.5.219,从机: ...
- ansible笔记第二章(ansible-varable变量)
(1)变量类型 1.1在playbook文件中的play使用变量 [root@m01 project1]# cat vars_1.yml - hosts: oldboy vars: - web_p ...
- js之new的原理和源码
new的原理即作用: function Student(name,age){ this.name=name; this.age=age; } var stu=new Student("小明& ...
- Mybatis动态SQL语句大全
读完这篇文章里你能收获到 Mybatis动态SQL语句大全 Mybatis中如何定义变量 Mybatis中如何提取公共的SQL片段 1. If 语句 需求:根据作者名字和博客名字来查询博客!如果作者名 ...
- BIP查询框添加查询条件
// 搜索框添加查询条件 viewModel.on("afterMount", function (data) { let agentId = viewModel.getParam ...
- 现代 C++ 教程 高速上手 C++ 11/14/17/20
国人作品,主要介绍C++11/14/17的新特性,适合新手阅读
- 从各种点理解Unity中的协程
这个写的很好,https://zhuanlan.zhihu.com/p/59619632