题目地址:

https://leetcode.com/problems/maximum-number-of-non-overlapping-palindrome-substrings/description/

给定一个长 n n n字符串 s s s和一个正整数 k k k。可以将 s s s中选取若干不重合子串,使得每个子串长度大于等于 k k k,并且都是回文串。问所有选法里子串个数的最大值。

先预处理一个bool数组 g g g,使得 g [ i ] [ j ] g[i][j] g[i][j]表示 s [ i : j ] s[i:j] s[i:j]是否是回文串。接下来开一个数组 f f f, f [ i ] f[i] f[i]表示 s s s的前 i i i个字符最多能找到多少个不重合的回文子串且每个子串长度大于等于 k k k。分两种情况:
1、 s [ i − 1 ] s[i-1] s[i−1]不属于最优方案的子串,此时 f [ i ] = f [ i − 1 ] f[i]=f[i-1] f[i]=f[i−1]。
2、 s [ i − 1 ] s[i-1] s[i−1]属于最优方案的子串,那么由于最后一个子串长度大于等于 k k k,从而可以枚举最后一个子串的起始位置。但是其实只需要看最后个子串长度 k k k和 k + 1 k+1 k+1的情况即可(即奇回文和偶回文两种可能)。因为如果再长的话,之前一定是取到了最大值的。

代码如下:

class Solution {public:int maxPalindromes(string s, int k) {int n = s.size();bool g[n + 1][n + 1];memset(g, 1, sizeof g);for (int len = 1; len <= n; len++)for (int l = 0; l + len - 1 < n; l++) {int r = l + len - 1;if (len == 1)g[l][r] = true;else if (len == 2)g[l][r] = s[l] == s[r];elseg[l][r] = s[l] == s[r] ? g[l + 1][r - 1] : false;}vector<int> f(n + 1, 0);for (int i = k - 1; i < n; i++) {f[i + 1] = f[i];if (g[i - k + 1][i]) f[i + 1] = max(f[i + 1], 1 + f[i - k + 1]);if (i - k >= 0 && g[i - k][i]) f[i + 1] = max(f[i + 1], 1 + f[i - k]);}return f[n];}
};

时空复杂度 O ( n 2 ) O(n^2) O(n2)。

【Leetcode】2472. Maximum Number of Non-overlapping Palindrome Substrings相关推荐

  1. 【leetcode】654. Maximum Binary Tree

    题目如下: Given an integer array with no duplicates. A maximum tree building on this array is defined as ...

  2. 【Python】ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve...

    ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence. &q ...

  3. 【LeetCode】104. Maximum Depth of Binary Tree (2 solutions)

    Maximum Depth of Binary Tree  Given a binary tree, find its maximum depth. The maximum depth is the ...

  4. 【leetcode】104. Maximum Depth of Binary Tree

    1. 题目 Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along th ...

  5. 【LeetCode】053. Maximum Subarray

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...

  6. 【LeetCode】152. Maximum Product Subarray

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...

  7. 【LeetCode】871. Minimum Number of Refueling Stops 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心算法 日期 题目地址:https://leetc ...

  8. 【LeetCode】-- 260. Single Number III

    问题描述: https://leetcode.com/problems/single-number-iii/ 在一个数组里面,只有两个元素仅出现过1次,其余都出现过两次.找出出现仅一次的那两个(a, ...

  9. 【Leetcode】1526. Minimum Number of Increments on Subarrays to Form a Target Array(配数学证明)

    题目地址: https://leetcode.com/problems/minimum-number-of-increments-on-subarrays-to-form-a-target-array ...

最新文章

  1. 工欲善其事必先利其器,一款开源编码辅助工具~
  2. Spring5源码 - 03 普通对象对应的BeanDefinition是如何存入DefaultListableBeanFactory#beanDefinitionMap 源码分析
  3. Sweet.js 用 Readtables 编译 JSX
  4. linux 端口 837,《Linux菜鸟入门》系统日志
  5. setnx是原子操作吗_Redis面试七连问,你能扛得住吗?
  6. 经典算法研究系列:七、深入浅出遗传算法,透析GA本质【转载】
  7. NodeJS + Lighthouse + Gulp 搭建自动化网站性能测试工具
  8. springboot 整合JWT token验证机制
  9. assert.notDeepEqual()
  10. 搞笑又雷人的个人签名
  11. 服务器网页源代码被修改6,特洛伊木马服务器源代码(C#)
  12. 什么是客户端与服务器端
  13. java开源项目jeecgboot全解析
  14. 关于MFC的使用总结之八——CGridListCtrlEx鼠标响应事件
  15. html获取cookie数据,cookies数据是什么意思?
  16. Codeforces Round #742 (Div. 2) C. Carrying Conundrum(思维)
  17. [LOJ3086] [GXOI2019] 逼死强迫症
  18. 浏览器内置pdf去除工具栏
  19. C练题笔记之:Leetcode-1460. 通过翻转子数组使两个数组相等
  20. c++ primer 第五版 阅读笔记四

热门文章

  1. 沃通SSL精灵,让站点HTTPS永只是期
  2. C语言 九九乘法口诀表 实现从大到小排序
  3. Xcode 项目改名及出错处理
  4. 新iPhone全面5G!4种杯型,最便宜只要5500,均内置中国北斗-1
  5. “微信之父”张小龙的书单
  6. 03 K近邻法——读书笔记
  7. 程序设计天梯赛L3-5 (数组开小然后T了,样例不过的代码才能AC,逆天盲僧)
  8. JAVA 文件url转存本地
  9. 金蝶拓展报表教程链接地址
  10. div添加文字位置会改变的问题