python最长回文子串动态规划_最长回文子串问题

python最长回文子串动态规划_最长回文子串问题问题描述回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。输入一个字符串Str,输出Str里最长回文子串的长度。方法一:暴力求解遍历每一个子串,再判断这个子串是不是回文串,最后判断这个串是不是最长的回文子串。遍历子串的复杂度是O(n^2),判断是不是回文串的复杂度是O(n),所以这个算法的复杂度是O(n^3)。方法二:动态规划法用一个二维的数组ai来表示从第i位到第j位的子…

大家好,又见面了,我是你们的朋友全栈君。

问题描述

回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。

输入一个字符串Str,输出Str里最长回文子串的长度。

方法一:暴力求解

遍历每一个子串,再判断这个子串是不是回文串,最后判断这个串是不是最长的回文子串。

遍历子串的复杂度是O(n^2),判断是不是回文串的复杂度是O(n),所以这个算法的复杂度是O(n^3)。

方法二:动态规划法

用一个二维的数组ai来表示从第i位到第j位的子串是不是回文串,在判断从i到j的子串是不是回文串时,可以先看i+1到j-1是不是回文串,再判断i位和j位是不是相同。这个算法中,遍历子串的复杂度仍然是O(n^2),但是判断是不是回文串的复杂度降到了O(1),所以这个算法的复杂度是O(n^2)。但是这个算法占据了O(n^2)的空间。

方法三:中心扩展法

顾名思义,任何一个回文串都有一个对称轴,从这个中心的位置开始,向两边扩展,可以得到以此为中心的最长回文串。但是要注意,这个对称轴的位置,可能是一个字符,也可能是两个字符中间。遍历对称轴的位置,复杂度是O(n),找到以此对称轴为中心的最长回文串,其复杂度是O(n),所以此算法的复杂度是O(n^2)。这个算法比动态规划好的地方是其空间复杂度只有O(1)。

#include

#include

using namespace std;

#define LEN 1000

int main(){

char str[LEN];

cin>>str;

int len=strlen(str);

int maxlen=0,mx;

for(int i=0;i

mx=1;

for(int j=1;(i-j>=0)&&(i+j

if(str[i-j]==str[i+j])

mx+=2;

else break;

}

maxlen=maxlen>mx?maxlen:mx;

}

for(int i=0;i

mx=0;

for(int j=0;(i-j>=0)&&(i+j+1

if(str[i-j]==str[i+j+1])

mx+=2;

else break;

}

maxlen=maxlen>mx?maxlen:mx;

}

cout<

return 0;

}

方法四:manacher算法

预处理

在字符串的开始加上一个’$’符,然后在每个字符中间插上一个’#’。比如,字符串ss=’abac’,处理之后是str=’$#a#b#a#c#’。接下来的计算针对处理后的字符串。

len数组

然后定义一个len数组,len[i]表示的是以str[i]为中心的最长回文串的半径。

仍以上面的字符为例。str=’$#a#b#a#c#’,以str[0]为中心的最长回文串是’$’,其半径是1;以str[4]为中心的最长回文串是’#a#b#a#’,其半径是4;len数组为{1,1,2,1,4,1,2,1,2,1}。可以发现,len[i]-1的值,就是原字符串ss中对应的回文串的长度(以#为中心的是偶长度的回文串,以字符为中心的是奇长度的回文串)。

计算len数组

算法的关键在于在计算len数组时,可以利用前面的结果进行优化。

引入变量maxright表示当前访问到的所有回文子串,所能触及的最右一个字符的位置;同时记录maxright所对应的回文串的对称轴的位置,记为pos。

复杂度分析

考虑p的值的变化,在计算的过程中,p只会增加不会减少,当p增加到strlen(str)时,每个位置的len数组的值都可以立即计算得出。所以算法的复杂度是O(n)。

#include

#include

#include

using namespace std;

#define N 100004

string str,ss;

int len[2*N+1];

int main()

{

cin>>ss;

str=”$#”;

for(unsigned int i=0;i

{

str+=ss[i];

str+=”#”;

}

// cout<

int pos=0,p=0,j=0;

len[0]=1;

for(unsigned int i=1;i

{

j=2*pos-i;

if(p>i)

len[i]=(len[j]>p-i)?(p-i):(len[j]);

else

len[i]=1;

while(i+len[i]=0&&str[i+len[i]]==str[i-len[i]])

len[i]++;

if(i+len[i]>=p)

{

pos=i;

p=i+len[i];

}

}

int ans=0;

for(int i=0;i

{

// cout<

ans=(len[i]-1>=ans)?len[i]-1:ans;

}

// cout<

cout<

return 0;

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137462.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python程序高效地调试

    现在我在debugpython程序就只是简单在有可能错误的地方print出来看一下,不知道python有没像c++的一些IDE一样有单步调试这类的工具?或者说各位python大神一般是怎么debug

    2021年12月27日
    53
  • Docker安装Rabbitmq3.8.7[通俗易懂]

    Docker安装Rabbitmq3.8.7[通俗易懂]Docker环境下安装Rabbitmq一、简介什么是rabbitmq:RabbitMQ是一套开源(MPL)的消息队列服务软件,是由LShift提供的一个AdvancedMessageQueuingProtocol(AMQP)的开源实现,由以高性能、健壮以及可伸缩性出名的Erlang写成。官网地址:https://www.rabbitmq.com/二、环境准备LInux环境:Centos7Docker版本:17.12.0-ce预装MQ版本:3.8.7SS

    2022年5月23日
    43
  • 计算机启动显示安装程序正在启动服务,电脑停在“安装程序正在启动服务”解决办法…[通俗易懂]

    计算机启动显示安装程序正在启动服务,电脑停在“安装程序正在启动服务”解决办法…[通俗易懂]电脑卡在“安装程序正在启动服务”解决办法朋友你好我是小飞这是2019年我们第315次见面。早上一小伙伴的电脑出问题了,送过来我解决了之后,决定把这些问题和解决步骤总结出来,以便将来有人用得上。问题描述:电脑恢复出厂模式后,重新启动会一直停在“安装程序正在启动服务”。不管你怎么开机重启都不行。这里,提出解决步骤:重新启动,连续按F2,进入BIOS系统,然后按enter回车键,重新启动。(最重要的一步…

    2022年6月15日
    109
  • Oracle创建数据库语句_oracle创建表的sql语句

    Oracle创建数据库语句_oracle创建表的sql语句Oracle创建表空间,用户及授权

    2022年9月22日
    6
  • mac navicat prenium 15.0.29 激活码[免费获取]

    (mac navicat prenium 15.0.29 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月21日
    91
  • 4G LTE Advanced_LTE百科

    4G LTE Advanced_LTE百科IS-95   IS-95是由高通公司发起的第一个基于CDMA数字蜂窝标准。IS全称为InterimStandard,即暂时标准,基于IS-95的第一个品牌是cdmaOne。IS-95也叫TIA-EIA-95。它是一个使用CDMA的2G移动通信标准,一个数据无线电多接入方案,其用来发送声音,数据和在无线电话和蜂窝站点间发信号数据(如被拨电话号码)。IS-95及其相关标准是最早商用的

    2022年10月4日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号