问题描述:

给出一个字符串S,求S的最长回文子串的长度。

例:字符串“ASDFGHGFDSB”的最长回文子串为“SDFGHGFDS”,长度为9。

显然暴力解法的复杂度较大,采用动态规划可以更好的解决这类问题。

令dp[i][j]表示S[i]至S[j]所表示的子串是否回文,是则为1,不是则为0.这样可以根据S[i]和S[j]是否相等分为两种情况:

  1. 如果S[i]==S[j],那么只要S[i+1]至S[j-1]是回文子串,那么S[i]至S[j]也是回文子串;如果S[i+1]至S[j-1]不是回文子串,那么S[i]至S[j]也不是回文子串;
  2. 如果S[i]!=S[j],那么S[i]至S[j]一定不是回文子串

边界:dp[i][i]=1, dp[i][i+1]=(S[i]==S[i+1])?1:0

如果按照i和j从小到大的顺序来枚举子串的端点,然后更新dp[i][j],这样会无法保证dp[i+1][j-1]得到计算。

因为边界的子串长度为1和2,所以可以考虑按照子串的长度和初始位置进行枚举,即第一遍将子串长度为3的dp值全部求出来,第二遍计算长度为4的子串可以通过计算出的长度为3的子串的dp值进行计算。这样问题就可以得到解决,代码如下:

#include<cstdio>
#include<cstring>
const int maxn = 10010;
char S[maxn];
int dp[maxn][maxn];
int main()
{gets(S);int len = strlen(S);int ans = 1; //初始化最长回文子串长度为1 memset(dp, 0, sizeof(dp));for (int i = 0; i < len; i++){dp[i][i] = 1;if (i < len - 1){if (S[i] == S[i + 1]){dp[i][i + 1] = 1;ans = 2;}}}//状态转移方程for (int L = 3; L <= len; L++){for (int i = 0; i + L - 1 < len; i++){int j = i + L - 1;if (S[i] == S[j] && dp[i + 1][j - 1] == 1){dp[i][j] = 1;ans = L;}}}printf("%d\n", ans);
}

最长回文子串问题求解相关推荐

  1. leetcode 5 :Longest Palindromic Substring 找出最长回文子串

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  2. python【力扣LeetCode算法题库】5- 最长回文子串

    5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...

  3. leetcode算法题--最长回文子串

    题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/ 相关题目:最长回文子序列 动态规划 dp[i][j]表示从i到 ...

  4. LeetCode:Longest Palindromic Substring 最长回文子串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  5. Manacher 求最长回文子串算法

    Manacher算法,是由一个叫Manacher的人在1975年发明的,可以在$O(n)$的时间复杂度里求出一个字符串中的最长回文子串. 例如这两个回文串"level"." ...

  6. 【字符串】最长回文子串 ( 动态规划算法 ) ★

    文章目录 一.回文串.子串.子序列 二.最长回文子串 1.动态规划算法 2.动态规划算法代码示例 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都 ...

  7. 【字符串】最长回文子串 ( 蛮力算法 )

    文章目录 一.回文串.子串.子序列 二.最长回文子串 1.蛮力算法 2.时间复杂度最优方案 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都一样的 ...

  8. 中心扩散算法--最长回文子串

    这篇看一下中心扩散算法. 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2:输入: " ...

  9. 动态规划-最长回文子串

    输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2:输入: "cbbd" 输出 ...

最新文章

  1. BILIBILI 高并发实时弹幕系统的实战之路 | 架构师实践日
  2. Python中type和object的关系
  3. 【NLP】授人以渔:分享我的文本分类经验总结
  4. 开源RefreshListView下拉刷新效果
  5. 【英语学习】【WOTD】hypermnesia 释义/词源/示例
  6. 达内2018年最新前端
  7. 深入浅出计算机组成原理03:处理器
  8. 崛起的 Python,真的影响了 76 万人?
  9. 数据结构 实践项目——数据结构、算法、程序设计
  10. PDF转jpg for MAC
  11. 2022最新RTMP+HTTP直播地址汇总(亲测可用)
  12. 熊猫关键词工具v2.8.1.0绿色版SEO工具
  13. win7 计算机 地址栏扫描,Win7系统添加地址栏的两种方法
  14. 弘辽科技:如何做好淘宝店铺推广?有什么技巧吗?
  15. RIP路由协议及工作原理
  16. android大字体原理,如何让Android TextView(包括子类)的字体大...
  17. 转载 Fluent中的压力分类
  18. 最终幻想java中文版_【个人翻译系列】java版FF2(最终幻想二代)英文剧情(第九期)...
  19. Linux阿里云服务器Tomact从部署到放弃(踩坑系列)
  20. 《Concurrency in Go》阅读笔记 -- 第三章:Go语言并发组件

热门文章

  1. paip.花生壳 服务启动失败 以及不能安装服务,权限失败的解决
  2. Configuration Manager 2012 R2基础知识
  3. Streamlit - 小记
  4. 展讯平台初步调试笔记
  5. shineblink APDS-9960靠近感应及环境光强度测量
  6. 1290 越狱(逆向思维-快速幂)
  7. 普元DevOps使用规范与流程
  8. 分享一副现实版抽象画
  9. 依赖树(dependecyTree)-语义边、两个词语之间的依赖边路径
  10. Nginx 学习日记2