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. 使用WinDbg内核调试

    首先你要配置好测试环境:参考VMware+Windgb+Win7 内核驱动调试 在你的主机上配置Symbols 配置sympath,C:\Users\Admin\Desktop\first\objch ...

  2. TOE(TCP/IP Offload Engine)网卡与一般网卡的区别

    TCP减压引擎,第一次听说这个名词,但是并不是一个新的概念了,若干年前听说过设备厂商在研究在FPGA之中实现TCP Stack,但是后来没有听到任何的产品出来,应该是路由设备to host的traff ...

  3. JavaScript去除日期中的“-”

    JavaScript去除日期中的"-" 1.说明 经常会出现这样的情况,页面的日期格式是:YYYY-MM-DD,而数据库中的日期格式是:YYYYMMDD,两者之间需要转换一下,方能 ...

  4. Linux集群问题~浅谈

    系统扩展的方式 # scale up 向上扩展 # scale out 向外扩展 集群类型 LB 负载均衡集群 Load Balancing HA 高可用集群 High Availability HP ...

  5. hdu5904 LCIS

    这题惩罚我这种经常不管常数的懒人 直接 1e6 TLE 如果1e5对数组枚举过 诶其实很想吐槽些伤心事,但是还是不想在博客上吐口水 不管今年比赛结果如何 请享受比赛 #include<bits/ ...

  6. setBit testBit权限管理(shiro项目中来的二)

    一,setBit testBit权限管理的理解 1.1.jdk7文档解释 public boolean testBit(int n)Returns true if and only if the de ...

  7. 手机端仿ios的银行下拉脚本五

    代码 <script> $('#bankName').click(function(){ var $this = $(this); new Picker({ "title&quo ...

  8. WPF基础篇之命名空间

    WPF中XAML与C#一样,也有自己独立的编译器.XAML会被解析和编译,最终形成微软的中间语言存储在程序集中.在解析和编译XAML的语言过程中,我们经常需要告诉编译器一些重要的信息,比如XAML代码 ...

  9. jQuery拓展简易快速实现触摸效果

    1.js代码 //触摸开始事件,改变元素的样式 function touchstart(e) { $(this).removeClass("touchend").addClass( ...

  10. java.util报错

    主要是java运行时环境没有配置好,需要添加JRE