最长回文子串问题求解
问题描述:
给出一个字符串S,求S的最长回文子串的长度。
例:字符串“ASDFGHGFDSB”的最长回文子串为“SDFGHGFDS”,长度为9。
显然暴力解法的复杂度较大,采用动态规划可以更好的解决这类问题。
令dp[i][j]表示S[i]至S[j]所表示的子串是否回文,是则为1,不是则为0.这样可以根据S[i]和S[j]是否相等分为两种情况:
- 如果S[i]==S[j],那么只要S[i+1]至S[j-1]是回文子串,那么S[i]至S[j]也是回文子串;如果S[i+1]至S[j-1]不是回文子串,那么S[i]至S[j]也不是回文子串;
- 如果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);
}
最长回文子串问题求解相关推荐
- leetcode 5 :Longest Palindromic Substring 找出最长回文子串
题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...
- python【力扣LeetCode算法题库】5- 最长回文子串
5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...
- leetcode算法题--最长回文子串
题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/ 相关题目:最长回文子序列 动态规划 dp[i][j]表示从i到 ...
- LeetCode:Longest Palindromic Substring 最长回文子串
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- Manacher 求最长回文子串算法
Manacher算法,是由一个叫Manacher的人在1975年发明的,可以在$O(n)$的时间复杂度里求出一个字符串中的最长回文子串. 例如这两个回文串"level"." ...
- 【字符串】最长回文子串 ( 动态规划算法 ) ★
文章目录 一.回文串.子串.子序列 二.最长回文子串 1.动态规划算法 2.动态规划算法代码示例 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都 ...
- 【字符串】最长回文子串 ( 蛮力算法 )
文章目录 一.回文串.子串.子序列 二.最长回文子串 1.蛮力算法 2.时间复杂度最优方案 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都一样的 ...
- 中心扩散算法--最长回文子串
这篇看一下中心扩散算法. 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2:输入: " ...
- 动态规划-最长回文子串
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2:输入: "cbbd" 输出 ...
最新文章
- BILIBILI 高并发实时弹幕系统的实战之路 | 架构师实践日
- Python中type和object的关系
- 【NLP】授人以渔:分享我的文本分类经验总结
- 开源RefreshListView下拉刷新效果
- 【英语学习】【WOTD】hypermnesia 释义/词源/示例
- 达内2018年最新前端
- 深入浅出计算机组成原理03:处理器
- 崛起的 Python,真的影响了 76 万人?
- 数据结构 实践项目——数据结构、算法、程序设计
- PDF转jpg for MAC
- 2022最新RTMP+HTTP直播地址汇总(亲测可用)
- 熊猫关键词工具v2.8.1.0绿色版SEO工具
- win7 计算机 地址栏扫描,Win7系统添加地址栏的两种方法
- 弘辽科技:如何做好淘宝店铺推广?有什么技巧吗?
- RIP路由协议及工作原理
- android大字体原理,如何让Android TextView(包括子类)的字体大...
- 转载 Fluent中的压力分类
- 最终幻想java中文版_【个人翻译系列】java版FF2(最终幻想二代)英文剧情(第九期)...
- Linux阿里云服务器Tomact从部署到放弃(踩坑系列)
- 《Concurrency in Go》阅读笔记 -- 第三章:Go语言并发组件