回文子串、回文子序列相关题目

回文子串是要连续的,回文子序列可不是连续的。

516. 最长回文子序列

dp数组含义:dp[i][j]dp[i][j]dp[i][j] 表示子序列 s[i,j]s[i,j]s[i,j] 中的最长回文子序列的长度。

dp数组初始化:子序列长度为 1 时,最长回文子序列的长度就是 1, 即s[i,i]=1s[i,i]=1s[i,i]=1

递推公式

遍历顺序

这里顺序比较讲究,我们知道,动态规划解法的遍历顺序需要遵循的原则是要按照递推公式的依赖关系,即递推公式中计算 dp 数组中的某个值时一定要保证它所依赖的值已经在 dp 数组中被计算好了。

在本题中,我们看到递推公式中,dp[i][j]dp[i][j]dp[i][j] 的值依赖于三个值:dp[i+1][j−1]dp[i+1][j-1]dp[i+1][j−1] 、dp[i+1][j]dp[i+1][j]dp[i+1][j]、dp[i][j−1]dp[i][j-1]dp[i][j−1],我们所选择的遍历顺序需要保证在计算 dp[i][j]dp[i][j]dp[i][j] 时这三个值都已经计算过了,那么很明显的,iii 要从大往小,jjj 要从小往大。

class Solution {public:int longestPalindromeSubseq(string s) {int n = s.size();vector<vector<int>> dp(n, vector<int> (n));for (int i=0; i<n; ++i) dp[i][i] = 1;for (int i=n-1; i>=0; --i) {for (int j=i+1; j<n; ++j) {if (s[i] == s[j]) dp[i][j] = dp[i+1][j-1] + 2;else dp[i][j] = max(dp[i+1][j], dp[i][j-1]);}}return dp[0][n-1];}
};

5. 最长回文子串

dp数组含义:dp[i][j]dp[i][j]dp[i][j] 表示子串 s[i,j]s[i, j]s[i,j] 是否为回文串。

dp数组初始化:长度为 1 的子串,即 s[i,i]s[i,i]s[i,i] 一定是回文串。

递推公式

遍历顺序

外层循环遍历子串的长度,内层循环遍历起始位置,这里也可以考虑与上面类似的遍历顺序思路,会在下一题中给出代码。

class Solution {public:string longestPalindrome(string s) {int n = s.size();if (n < 2) return s;string ans(1, s[0]);vector<vector<bool>> dp(n, vector<bool> (n));for (int i=0; i<n; ++i) dp[i][i] = true;for (int len=2; len<=n; ++len) {for (int i=0; i<n; ++i) {int j = i + len - 1;if (j >= n) break;if (s[i] != s[j]) dp[i][j] = false;else {if (len <= 3) dp[i][j] = true;else dp[i][j] = dp[i+1][j-1];}if (dp[i][j] && len>ans.size()) ans = s.substr(i, len);}}return ans;}
};

647. 回文子串

思路和上一题逻辑类似

遍历顺序一,与上题一致

class Solution {public:int countSubstrings(string s) {int n = s.size();if (n < 2) return n;vector<vector<bool>> dp(n, vector<bool> (n));for (int i=0; i<n; ++i) dp[i][i] = true;int ans = n;for (int len=2; len<=n; ++len) {for (int i=0; i<n; ++i) {int j = i + len - 1;if (j >= n) break;if (s[i] != s[j]) dp[i][j] = false;else {if (len <= 3) {dp[i][j] = true;++ans;}else {if (dp[i+1][j-1]) {dp[i][j] = true;++ans;}else dp[i][j] = false;}}}}return ans;}
};

另一种根据长度和起始位置的遍历顺序,思路类似题516:

class Solution {public:int countSubstrings(string s) {int n = s.size();int ans = 0;vector<vector<bool>> dp(n, vector<bool> (n, false));for (int i=n-1; i>=0; --i) {for (int j=i; j<n; ++j) {if (s[i] == s[j]) {if (abs(i-j) <= 1) {dp[i][j] = true;++ans;}else {if (dp[i+1][j-1]) {dp[i][j] = true;++ans;}}}}}return ans;}
};

回文子串、回文子序列相关题目相关推荐

  1. BZOJ2565 最长双回文子串 回文自动机,回文树

    bzoj2565: 最长双回文串 题意 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"cba" ...

  2. 牛客题目——最长公共子串、最长回文子串、兑换零钱

    文章目录 题目1--最长公共子串 解题思路 代码实现 题目2--最长回文子串 解题思路 代码实现 题目3--兑换零钱 解题思路 代码实现 题目1--最长公共子串 给定两个字符串str1和str2,输出 ...

  3. LeetCode--5.最长回文子串(滑动窗口)

    最长回文子串(C) 1. 题目描述 2. 题目分析 3. C语言实现 1. 题目描述 难度:中等 2. 题目分析 根据题目,需要注意的有以下几点: 回文子串 回文子串就是正着读和反着读是一样的,比如a ...

  4. 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...

    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathi ...

  5. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

  6. 总结几个字符串类的动态规划(最长公共子串,回文子串,子序列)

    在阅读下面的题目之前,首先需要确定的是,求子序列还是子串,子串需要是连续的,子序列无需连续,比如 "Hello",子串可以是 Hel, llo, lo 等,子序列可以是 Hlo, ...

  7. 【代码训练营】day56 | 647. 回文子串 516.最长回文子序列

    所用代码 java 回文子串 LeetCode 647 题目链接:回文子串 LeetCode 647 - 中等 思路 dp[i] [j]:[i, j]子串是否是回文子串,是回文就是true 递推公式: ...

  8. 动态规划:最长回文子串 最长回文子序列

    一.题目 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如 "a"."aba"."abba". 对于一个字符串,其子 ...

  9. 最长回文子串与最长回文子序列

    文章目录 最长回文子串与最长回文子序列 最长回文子串 题目描述 dp解法 从中心扩展 马拉车算法 最长回文子序列 题目描述 dp 解法 递归思想 最长回文子串与最长回文子序列 最长回文子串 LeetC ...

  10. 最长回文子串和最长回文子序列

    这两个题目我觉得可以放在一起讨论下: 字长回文子序列 首先是回文子序列的题目,涉及到子序列,一般都是不连续的问题: 那么首推动态规划,并且这个题目只要求返回长度,那么dp数组用来存子问题的最长回文串长 ...

最新文章

  1. ORM操作models一对多、多对多关系
  2. 美国-5大牛校--8条小牛--14好校--18很不错的大学
  3. gradle 上传jar包_gradle 打包jar上传到nexus 同时上传源码jar
  4. C++ new和malloc的区别
  5. EXTjs+SpringMVC+Mybatis实现照片的上传,下载,查看关键技术整理
  6. AI CycleGAN
  7. xps文件的查看及转换
  8. 人脸识别活体检测的一些方法
  9. 海康直连工具 海康测试工具,工程宝测试软件等
  10. 3D游戏设计读书笔记二
  11. linux从源码编译cairo,如何在windows下编译cairo
  12. 低通滤波器计算截止评率_科普文|一文了解电阻-电容(RC)低通滤波器
  13. 集成开发环境-大数据开发平台的门户
  14. 零基础入门C语言,只需2小时轻松学会!
  15. md 文件使用html阅读,使用markdow-it渲染md文件为html页面
  16. 原标题:我如何三天就写完了毕业论文!
  17. 基本数据类型 int操作 bool布尔操作 str字符串操作 for in 循环
  18. 秉火429笔记之一初识STM32
  19. 世界女性科技群落(五):数字化黄金时代,东南亚女性都是隐藏的阿尔法
  20. Unit 5: Windows Acquisition 5.1 Windows Acquisition Windows Forensic Imaging of Drives

热门文章

  1. r访问oracle数据库,R学习笔记之访问远程Oracle数据库
  2. 《2020年国际会计事务所排名》
  3. linux mint怎么切换输入法,Linux Mint安装ibus五笔和拼音输入法简明教程(示例代码)...
  4. 微信小程序 公证号 根据code获取openid
  5. 【资源下载】分享个嵌入式开发的入门教程(包含视频)
  6. Idea之配置GitLab ssh key
  7. 小米手机获取ROOT权限的一些坑及补坑经验
  8. bootstrap制作一个优美的导航栏
  9. xp系统打开sql服务器不可用,xp系统安装sql2000个人版无反应
  10. 小白转行学IT入职BAT应该怎么做