题目描述
给定一个字符串,请你求出其中的最长回文子串的长度。
例如,给定字符串 Is PAT&TAP symmetric?,最长回文子串为 s PAT&TAP s,其长度是 11。

输入格式
包含一个非空字符串。

输出格式
输出一个整数,表示给定字符串的最长回文子串的长度。

数据范围
给定字符串的长度不超过 1000。

输入样例:
Is PAT&TAP symmetric?
输出样例:
11

分析: 先讲讲最暴力的解法。先套用两层循环得到字符串s的子串,光是这一步骤就得用掉O(n^2)的复杂度,接着就是判断这个字符串是否是回文串,那么这个方法的总复杂度是O(n^3),很明显会超时。
有两种思路,一种是对暴力法的优化,使用双指针,一种是利用动态规划的思想,由小规模到大规模,很容易利用小规模的结果推出大规模的子串是否是回文串。

思路一: 我们依旧在第一层循环遍历字符串的所有元素,然后直接在这个字符串上面寻找能得到的最长的回文串,只需要一层循环就好了,但是,这一层循环我们需要用两次,为什么?举个回文串ABCDDCBA,当我们遍历到下标为3的元素D时,我们直接以这个元素为中心,分别往两头走找到最长回文串,这个子串的长度一定是奇数的,然而回文串也是有偶数的情况的,即以两个元素为中心(DD)。
代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){string s;int len=1;getline(cin,s);for(int i=0;i<s.size();++i){int l=i-1,r=i+1,ans=1;//串长度为奇数while(l>=0&&r<s.size()&&s[l]==s[r])ans+=2,l--,r++;len=max(len,ans);l=i,r=i+1,ans=0;//串长度为偶数while(l>=0&&r<s.size()&&s[l]==s[r])ans+=2,l--,r++;len=max(len,ans);}printf("%d\n",len);
}

思路二: 开一个dp数组,dp[i][j]表示下标i到j的子串是否是回文子串,如果是,则dp[i][j]=1,否则为0。而我们在判断dp[i][j]时,先判断dp[i+1][j-1]是否为1,如果是,再判断s[i]是否和s[j]相等,两者都满足dp[i][j]才等于1。因此初始化的时候,dp[i][i]都为1(单个元素本身就是回文串)。初始化的时候,得到dp[i][i+1]的值。这样做,我们将来的遍历就直接避免了dp[i][i+1]的情况,从而避免判断dp[i+1][i]。
接着就开始算这个dp数组了,但是有一个问题,那就是动态规划的思想里面是要从小规模到大规模的。如果我直接两层for循环算每个dp[i][j],则会造成某些dp[i][j]的值造成错误,因为dp[i][j]的值要依赖dp[i+1][j-1],而dp[i+1][j-1]并不一定被初始化过了。比如第一层循环i=0,第二层循环到了3,dp[0][3]的结果要依赖dp[0][2],但是dp[0][2]并没有被初始化过,因此无法确定答案。
所以应该转化思路,利用两层循环无法实现动态规划的思想,那就把循环换成子串长度,之前初始化涉及到的子串长度有1和2,我们的循环就直接从3开始,那么我们的第一层循环就是从0到s.size()-L(L为子串长度),然后就可以比较这个新子串的两端值了,并且满足了动态规划的思想。
代码如下:

#include<bits/stdc++.h>
using namespace std;
int dp[1005][1005];
int main(){string s;int len=1;getline(cin,s);for(int i=0;i<s.size();++i)dp[i][i]=1;for(int i=1;i<s.size()-1;++i)if(s[i]==s[i+1])dp[i][i+1]=1,len=2;else dp[i][i+1]=0;for(int L=3;L<=s.size();++L)for(int i=0;i<s.size()-L+1;++i){if(dp[i+1][i+L-2]&&s[i]==s[i+L-1])dp[i][i+L-1]=1,len=L;else dp[i][i+L-1]=0;}printf("%d\n",len);
}

Acwing:最长回文子串相关推荐

  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" 输出 ...

  10. java最长回文子序列_LeetCode[5] - 最长回文子串动态规划

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

最新文章

  1. 麻烦不断,Uber因保护用户隐私不力要接受20年的审计
  2. python增量赋值是什么_python学习记录20190122_增量赋值
  3. java js 转换_[Java教程]javascript 类型转换。
  4. php能做的事,PHP也能干大事 随机函数
  5. Python面向对象-特殊成员
  6. 计算机做游戏到大学要学什么,大学学什么专业,毕业才能从事电竞行业?
  7. wampserver 搭建 php环境 运行方法
  8. Springboot/Cloud集成Sentinel进阶实战
  9. 4_1网络学习第一天后感--网络数据下载
  10. scrapy 命令行基本用法
  11. 一氧化碳(CO)荧光探针cas855751-82-5,二氧化硫荧光探针 激发波长653 nm,发射波长836 nm-齐岳介绍
  12. 微信支付?一起观摩Safesound勒索病毒的骚操作
  13. 陈华主讲后盾网Laravel框架重入门到实战教程 Laravel博客项目实战教程 包含课件源码
  14. 罗素“杀死了”康托尔
  15. Android 实现欢迎界面
  16. 电阻电容电感二极管三极管在电路中的作用
  17. 比赛得分java_(比赛)得分:_____
  18. 什么是CISSP(国际注册信息安全认证专家)?
  19. Dos命令 netstat -ano 查看端口占用及关闭进程
  20. 蚂蚁开放平台开发者专场(上海站)欢迎参加!

热门文章

  1. 使用Ant打包java程序
  2. 二元最近的共同祖先问题(O(n) time 而且,只有一次遍历,O(1) Space (它不考虑函数调用栈空间))...
  3. 剑指_3.2不修改数组找出重复的数字(Python)
  4. 【SpringBoot_ANNOTATIONS】属性赋值 02 @PropertySource赋值
  5. 【Docker】 命令速查
  6. c语言二级考试题型2016,2016年计算机二级《C语言》操作试题及答案
  7. pythonjam怎么使用_jam怎么用啊多多举例子啊各种词意的用法
  8. C#实战篇-基于OOP设计新体育彩票选号器
  9. Keil自动格式化代码
  10. oracle交叉运算符,Oracle语句优化44个规则详解