1、中心扩展

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

但是要考虑两种情况:

1、像aba,这样长度为奇数。

2、想abba,这样长度为偶数。
代码如下:
string findLongestPalindrome(string &s)
{
const int length=s.size();
int maxlength=;
int start; for(int i=;i<length;i++)//长度为奇数
{
int j=i-,k=i+;
while(j>=&&k<length&&s.at(j)==s.at(k))
{
if(k-j+>maxlength)
{
maxlength=k-j+;
start=j;
}
j--;
k++;
}
} for(int i=;i<length;i++)//长度为偶数
{
int j=i,k=i+;
while(j>=&&k<length&&s.at(j)==s.at(k))
{
if(k-j+>maxlength)
{
maxlength=k-j+;
start=j;
}
j--;
k++;
}
}
if(maxlength>)
return s.substr(start,maxlength);
return NULL;
}
 
 
 
2、动态规划
 
有母串s,我们用c[i, j] = 1表示子串s[i..j]为回文子串,空间和算法复杂度也是O(N^2)。那么就有递推式:
c[i,j]={ c[i+,j−],   if s[i]=s[j]
, if s[i]≠s[j]

递推式表示在s[i] = s[j]情况下,如果s[i+1..j-1]是回文子串,则s[i..j]也是回文子串;如果s[i+1..j-1]不是回文子串,则s[i..j]也不是回文子串。

初始状态:

    c[i][i] =
c[i][i+] = if s[i] == s[i+]

上述式子表示单个字符、两个字符均是回文串[j]

int longestPald(char *str) {
int len = strlen(str);
int c[maxLen][maxLen];
int i,j;
int longest = ; assert(str != NULL);
if(len == ) {
return ;
}
//initialization
for(i = ; i < len; i++) {
c[i][i] = ;
if(str[i] == str[i+])
  c[i][i+] = ;
} for(i = ; i < len; i++) {
for(j = i+; j <= len; j++) {
if(str[i] == str[j]) {
c[i][j] = c[i+][j-];
//find longest palindrome substring
if(c[i][j]) {
int n = j - i + ;
if(longest < n)
longest = n;
}
} else {
c[i][j] = ;
}
}
}
return longest;
}

3、暴力法

最容易想到的就是暴力破解,求出每一个子串,之后判断是不是回文,找到最长的那个。

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

string findLongestPalindrome(string &s)
{
int length=s.size();//字符串长度
int maxlength=;//最长回文字符串长度
int start;//最长回文字符串起始地址
for(int i=;i<length;i++)//起始地址
for(int j=i+;j<length;j++)//结束地址
{
int tmp1,tmp2;
for(tmp1=i,tmp2=j;tmp1<tmp2;tmp1++,tmp2--)//判断是不是回文
{
if(s.at(tmp1)!=s.at(tmp2))
break;
}
if(tmp1>=tmp2&&j-i>maxlength)
{
maxlength=j-i+;
start=i;
}
}
if(maxlength>)
return s.substr(start,maxlength);//求子串
return NULL;
}

4、Manacher法(待续)

Algorithm --> 最长回文子串的更多相关文章

  1. Manacher's algorithm: 最长回文子串算法

    Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...

  2. 【转】最长回文子串的O(n)的Manacher算法

    Manacher算法 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长.这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文 ...

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

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

  4. 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297

    1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...

  5. 最长回文子串(Manacher算法)

    回文字符串,想必大家不会不熟悉吧? 回文串会求的吧?暴力一遍O(n^2)很简单,但当字符长度很长时便会TLE,简单,hash+二分搞定,其复杂度约为O(nlogn), 而Manacher算法能够在线性 ...

  6. 【回文字符串】 最长回文子串O(N) Manacher算法

    原理讲的清晰:Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串 注意: ①动态生命P[]和newStr数组后,不要忘记delete[] //其实这是基本的编码习惯 ②最终 ...

  7. URAL 1297 Palindrome 最长回文子串

    POJ上的,ZOJ上的OJ的最长回文子串数据量太大,用后缀数组的方法非常吃力,所以只能挑个数据量小点的试下,真要做可能还是得用manacher.贴一下代码 两个小错,一个是没弄懂string类的sub ...

  8. 51nod1089最长回文子串V2

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字 ...

  9. Palindrome - POJ 3974 (最长回文子串,Manacher模板)

    题意:就是求一个串的最长回文子串....输出长度. 直接上代码吧,没什么好分析的了.   代码如下: ================================================= ...

随机推荐

  1. 基于嵌入式操作系统VxWorks的多任务并发程序设计(1)――基本概念

    1引言 嵌入式系统定义义为:嵌入到对象体系中的专用计算机系统."嵌入性"."专用性"与"计算机系统"是嵌入式统的三个基本要素,对象系统则是指 ...

  2. MySQL显示状态信息

    MySQL显示状态信息 1.show status mysql> show status; +-----------------------------------+----------+ | ...

  3. List转换成JSON对象报错(一)

    List转换成JSON对象 1.具体报错如下 Exception in thread "main" java.lang.NoClassDefFoundError: org/apac ...

  4. (六)java结构控制语句

    选择语句,也叫条件分支语句:if--else和switch--case:其中if--else中的else是可选的,但是switch--case中的case是必须的.     switch后的条件必须是 ...

  5. Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)

    一.介绍           今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分.话不多说,开始我们今天的讲解.如果要想看第一篇文章,地址如下:http: ...

  6. java实现全排列问题

    1.问题描述: 一组字符串的全排列,按照全排列的顺序输出,并且每行结尾无空格. 2.输入: 输入一个字符串 3.输入示例: 请输入全排列的字符串: abc 4.输出示例: a b c a c b b ...

  7. 微信小程序—微信自动退款

    微信小程序—微信自动退款 一.业务背景 微信自动退款串接基于酷客多小程序商城系统,为方便财务人员进行订单退款而开发,将酷客多小程序系统财务退款流程和微信退款系统打通.实现一个系统管理运营. 二.业务流 ...

  8. CSS3 2D、3D转换

    2D转换方法:transform().rotate().scale().skew().matrix() 3D转换方法:rotateX().rotateY() 1.示例代码 <!DOCTYPE h ...

  9. 【BZOJ4555】求和(第二类斯特林数,组合数学,NTT)

    [BZOJ4555]求和(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 推推柿子 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)·j!·2^j\] \[=\sum_{i= ...

  10. Luogu P3412 仓鼠找$sugar$ $II$

    Luogu P3412 仓鼠找\(sugar\) \(II\) 题目大意: 给定一棵\(n\)个点的树, 仓鼠每次移动都会等概率选择一个与当前点相邻的点,并移动到此点. 现在随机生成一个起点.一个终点 ...