(算法)最长回文子串
题目:
求一个字符串的最长回文子串
思路:
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;
}
(算法)最长回文子串相关推荐
- 中心扩散算法--最长回文子串
这篇看一下中心扩散算法. 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2:输入: " ...
- manacher算法--最长回文子串
问题概述:输入一个字符串,输出它的最长回文子串 输入样例: 对应输出: abbaabcba ...
- 常考数据结构与算法:最长回文子串
暴力解法: 列举所有的子串,判断是否为回文串,保存最长的回文串. /** 暴力解法: 列举所有的子串,判断是否为回文串,保存最长的回文串.*/public int getLongestPalindro ...
- Manacher 求最长回文子串算法
Manacher算法,是由一个叫Manacher的人在1975年发明的,可以在$O(n)$的时间复杂度里求出一个字符串中的最长回文子串. 例如这两个回文串"level"." ...
- 【字符串】最长回文子串 ( 动态规划算法 ) ★
文章目录 一.回文串.子串.子序列 二.最长回文子串 1.动态规划算法 2.动态规划算法代码示例 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都 ...
- 【字符串】最长回文子串 ( 蛮力算法 )
文章目录 一.回文串.子串.子序列 二.最长回文子串 1.蛮力算法 2.时间复杂度最优方案 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都一样的 ...
- 最长回文子串动态规划_九章算法 | 微软面试题:最长回文子串
给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 在线评测地址:LintCode 领扣 样例 1: 输入:"abcdzdcab&quo ...
- Manacher's algorithms(马拉车算法)最长回文子串
最长回文子串 https://leetcode-cn.com/problems/longest-palindromic-substring/ 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 ...
- HihoCode1032 最长回文子串 manacher算法
求最长回文子串的算法比较经典的是manacher算法 转载自这里 首先,说明一下用到的数组和其他参数的含义: (1)p[i] : 以字符串中下标为的字符为中心的回文子串半径长度: 例如:abaa字符串 ...
- 怎么判断一个字符串的最长回文子串是否在头尾_每日一道算法题,让你的头脑更活跃(寻找最长回文子串)...
前言 最近准备把算法慢慢的捡起来,所以准备日更一道算法题目,难度自然是由简入难,所以同学们可以每天都来看看小编的更新. 日更时间定在每晚20:00,希望大家多多关注啦. 昨天就欠更了,简直就是打脸.过 ...
最新文章
- 20172322 《程序设计与数据结构》第八周学习总结
- wxpython组件SplitterWindow 的简单使用
- 软文:第三方支付技术的场景应用,支付技术延伸与国际化
- CentOS报错:“Could not resolve host: mirrorlist.centos.org; Unknown error“
- 【Java笔记】【Java核心技术卷1】chapter3 D4变量
- An internal error occurred during: Launching ****
- 解剖 Facebook 底层
- 网络安全架构与域划分(企业安全)
- js判断浏览器类型,判断ie内核,webkit
- 达梦:如何登录数据库(基础篇)
- 如何高效访问OneDrive个人存储空间?三种方法
- Win11图标变暗怎么办?Win11图标变暗的解决方法
- 无人驾驶清扫车落地之路的技术解析
- 濉溪海潮计算机学校校长是谁,濉溪县城关中心学校举办退休教师欢送会
- 为什么说用PHP开发大型系统令人不爽
- TensorFlow实现梯度下降法求解一元和多元线性回归问题
- 小韩谈shell -- 十分好玩的小脚本
- java读取excel 支持所有版本
- 腾讯-信鸽实现消息推送
- 潮牌服装专卖店装饰CAD图,设计属于自己的高档店!
热门文章
- vue用form上传图片_vuejs使用FormData,ajax上传图片文件
- 寻找中项和第k小元素c语言,分治法第k小元素poj2104.ppt
- ip查看是否在线_linux查看端口占用情况
- php实验cookie,PHP实验一、二(cookie和session)
- cmd mysql 报错_Mysql报错问题汇总
- C语言丨小 学 数 学(一):高精度加法
- mysql三高讲解(二):2.2 B+树的B的意义
- 通过channel进行goroutine间的通信
- mysql中主键的用法_MySQL中的主键以及设置其自增的用法教程
- pandas DateTime