题目:

求一个字符串的最长回文子串

思路:

1、暴力枚举

最容易想到的就是暴力破解,列举每一个子串,然后根据回文的定义判断是不是回文,找到最长的那个。

求每一个子串的时间复杂度为O(N^2),判断子串是不是回文的时间复杂度为O(N),所以时间复杂度为O(N^3)。

2、动态规划

回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文字符串,那么P[i+1,j-1]也是回文字符串。这样最长回文子串就能分解成一系列子问题了。

这样需要额外的空间是O(N^2),时间复杂度也是O(N^2)。

状态转移方程:

当str[i]=str[j] dp[i][j]=dp[i+1][j-1]

当str[i]!=str[j] dp[i][j]=0

初始状态:

dp[i][i]=1

dp[i][i+1]=1 if str[i]=str[i+1]

3、中心扩展

中心扩展就是把给定的字符串的每一个字符当做中心,向两边扩展,这样来找最长的子回文串。时间复杂度为O(N^2)。

但是要考虑两种情况:

如aba,这样长度为奇数。

如abba,这样长度为偶数。

4、Manacher法

待续

代码:

#include<iostream>
using namespace std;// brute force
string findLongestPalindrome_1(string &str){int length=str.size();int maxLength=0;int start;for(int i=0;i<length;i++){for(int j=i+1;j<length;j++){int left,right;for(left=i,right=j;left<right;left++,right--){if(str[left]!=str[right])break;}if(left>=right && (j-i)>maxLength){maxLength=j-i+1;start=i;}}}if(maxLength>0)return str.substr(start,maxLength);return NULL;
}// dynamic programming
string findLongestPalindrome_2(string &str){const int length=str.size();int maxLength=1;int start;bool dp[length][length];for(int i=0;i<length;i++)for(int j=0;j<length;j++)dp[i][j]=false;for(int i=0;i<length;i++){dp[i][i]=true;if(i<length-1 && str[i]==str[i+1]){dp[i][i+1]=true;start=i;maxLength=2;}}for(int len=3;len<=length;len++){for(int i=0;i<=length-len;i++){int j=i+len-1;if(dp[i+1][j-1] && str[i]==str[j]){dp[i][j]=true;start=i;maxLength=len;}}}if(maxLength>=2)return str.substr(start,maxLength);return NULL;
}// pivot expand
string findLongestPalindrome_3(string &str){const int length=str.size();int maxLength=1;int start;for(int i=0;i<length;i++){int left=i-1;int right=i+1;while(left>=0 && right<=length-1 && str[left]==str[right]){if(right-left+1>maxLength){start=left;maxLength=right-left+1;}left--;right++;}}for(int i=0;i<length;i++){int left=i;int right=i+1;while(left>=0 && right<=length-1 && str[left]==str[right]){if(right-left+1>maxLength){start=left;maxLength=right-left+1;}left--;right++;}}if(maxLength>0)return str.substr(start,maxLength);return NULL;
}int main(){string str="ababcddcbbd";cout<<findLongestPalindrome_1(str)<<endl;cout<<findLongestPalindrome_2(str)<<endl;cout<<findLongestPalindrome_3(str)<<endl;return 0;
}

  

(算法)最长回文子串相关推荐

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

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

  2. manacher算法--最长回文子串

    问题概述:输入一个字符串,输出它的最长回文子串 输入样例:                             对应输出: abbaabcba                            ...

  3. 常考数据结构与算法:最长回文子串

    暴力解法: 列举所有的子串,判断是否为回文串,保存最长的回文串. /** 暴力解法: 列举所有的子串,判断是否为回文串,保存最长的回文串.*/public int getLongestPalindro ...

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

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

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

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

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

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

  7. 最长回文子串动态规划_九章算法 | 微软面试题:最长回文子串

    给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 在线评测地址:LintCode 领扣 样例 1: 输入:"abcdzdcab&quo ...

  8. Manacher's algorithms(马拉车算法)最长回文子串

    最长回文子串 https://leetcode-cn.com/problems/longest-palindromic-substring/ 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 ...

  9. HihoCode1032 最长回文子串 manacher算法

    求最长回文子串的算法比较经典的是manacher算法 转载自这里 首先,说明一下用到的数组和其他参数的含义: (1)p[i] : 以字符串中下标为的字符为中心的回文子串半径长度: 例如:abaa字符串 ...

  10. 怎么判断一个字符串的最长回文子串是否在头尾_每日一道算法题,让你的头脑更活跃(寻找最长回文子串)...

    前言 最近准备把算法慢慢的捡起来,所以准备日更一道算法题目,难度自然是由简入难,所以同学们可以每天都来看看小编的更新. 日更时间定在每晚20:00,希望大家多多关注啦. 昨天就欠更了,简直就是打脸.过 ...

最新文章

  1. 20172322 《程序设计与数据结构》第八周学习总结
  2. wxpython组件SplitterWindow 的简单使用
  3. 软文:第三方支付技术的场景应用,支付技术延伸与国际化
  4. CentOS报错:“Could not resolve host: mirrorlist.centos.org; Unknown error“
  5. 【Java笔记】【Java核心技术卷1】chapter3 D4变量
  6. An internal error occurred during: Launching ****
  7. 解剖 Facebook 底层
  8. 网络安全架构与域划分(企业安全)
  9. js判断浏览器类型,判断ie内核,webkit
  10. 达梦:如何登录数据库(基础篇)
  11. 如何高效访问OneDrive个人存储空间?三种方法
  12. Win11图标变暗怎么办?Win11图标变暗的解决方法
  13. 无人驾驶清扫车落地之路的技术解析
  14. 濉溪海潮计算机学校校长是谁,濉溪县城关中心学校举办退休教师欢送会
  15. 为什么说用PHP开发大型系统令人不爽
  16. TensorFlow实现梯度下降法求解一元和多元线性回归问题
  17. 小韩谈shell -- 十分好玩的小脚本
  18. java读取excel 支持所有版本
  19. 腾讯-信鸽实现消息推送
  20. 潮牌服装专卖店装饰CAD图,设计属于自己的高档店!

热门文章

  1. vue用form上传图片_vuejs使用FormData,ajax上传图片文件
  2. 寻找中项和第k小元素c语言,分治法第k小元素poj2104.ppt
  3. ip查看是否在线_linux查看端口占用情况
  4. php实验cookie,PHP实验一、二(cookie和session)
  5. cmd mysql 报错_Mysql报错问题汇总
  6. C语言丨小 学 数 学(一):高精度加法
  7. mysql三高讲解(二):2.2 B+树的B的意义
  8. 通过channel进行goroutine间的通信
  9. mysql中主键的用法_MySQL中的主键以及设置其自增的用法教程
  10. pandas DateTime