python长度多少_用Python求最长子串长度快速版

哈喽大家好,周二也是令人愉快的一天啊,今天天气不错,坐在窗户旁边边晒太阳边写文章,再泡杯热茶,真是舒服美好,废话不多说,今天说一下Python求最长子串长度,希望对大家有作用,raksmart服务器。

给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4。最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子串长度。不用我说,枚举实现的耗时是我们无法忍受的。那么有没有高效查找回文子串的方法呢?答案当然是肯定的,那就是中心扩展法,选择一个元素作为中心,然后向外发散的寻找以该元素为圆心的最大回文子串。但是又出现了新的问题,回文子串的长度即可能是基数,也可能好是偶数,对于长度为偶数的回文子串来说是不存在中心元素的。那是否有一种办法能将奇偶长度的子串归为一类,统一使用中心扩展法呢?它就是manacher算法,在原字符串中插入特殊字符,例如插入#后原字符串变成'#3#5#5#3#4#3#2#1#'。现在我们对新字符串使用中心扩展发即可,中心扩展法得到的半径就是子串的长度。

现在实现思路已经明确了,先转化字符串'35534321' ----> '#3#5#5#3#4#3#2#1#',然后求出以每个元素为中心的最长回文子串的长度。以下给出Python实现:

功能已经实现了,经过测试也没有bug,但是我们静下心来想一想,目前的解法是否还有优化空间呢?根据目前的解法,我们求出了‘35534321‘中每个元素中心的最大回文子串。当遍历到'4'时,我们已经知道目前最长的回文子串的长度max_length是4,这是我们求出了以4为中心的最长回文子串长度是3,它比max_length要小,所以我们不更新max_length。换句话说,我们计算以4为中心的最长回文字串长度是做了无用功。这就是我们要优化的地方,既然某个元素的最长的回文子串长度并没有超过max_length,我们就没有必要计算它的最长回文子串,在遍历一个新的元素时,我们要优先判断以它为中心的回文子串的长度是否能超越max_length,如果不能超过,就继续遍历下一个元素。以下是优化后的实现:

#!/usr/bin/python

# -*- coding: utf-8 -*-

def max_substr(string):

s_list = [s for s in string]

string = '#' + '#'.join(s_list) + '#'

max_length = 0

length = len(string)

for index in range(0, length):

r_length = get_length2(string, index, max_length)

if max_length

max_length = r_length

return max_length

def get_length2(string, index, max_length):

# 基于已知的最长字串求最长字串

# 1.中心+最大半径超出字符串范围, return

r_ = len(string)

if index + max_length > r_:

return max_length

# 2.无法超越最大半径, return

l_string = string[index - max_length + 1 : index + 1]

r_string = string[index : index + max_length]

if l_string != r_string[::-1]:

return max_length

# 3.计算新的最大半径

result = max_length

for i in range(max_length, r_):

if index-i >= 0 and index+i

result += 1

else:

break

return result - 1

if __name__ == "__main__":

result = max_substr("35534321")

print result

那么速度到底提升了多少呢,以字符串1000个‘1’为例,优化前的算法执行时间为0.239018201828,优化后为0.0180191993713,速度提升了10倍左右

/usr/bin/python /Users/hakuippei/PycharmProjects/untitled/the_method_of_programming.py

怎么样,是不是很好用呢?今天就到这里,大家明天见咯。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EF Core 6 新功能汇总(二)

继上一篇之后,这一篇将给大家带来另外十个 EF Core 6 中的新功能特性,包括值转换器、脚手架和 DbContext 的改进等。1HasConversion 支持值转换器在 EF Core 6.0 中,HasConversion 方法的泛型重载方法可以指定内置或自定义的值转换器。public…

linux之lsusb命令和cd -命令使用总结

1、lsusb命令介绍 使用 lsusb 来列出 USB 设备和它的属性,lsusb 会显示驱动和内部连接到你系统的设备。直接在控制台输入 lsusb 即可 2、lsusb简单使用 在控制台输入 lsusb 效果如下 系统中同时使用了 USB 2.0 root hub 驱动和 USB 3.0 root hub 驱动。 bus 002 指明设备…

Fiddler (五) Mac下使用Fiddler

http://www.cnblogs.com/TankXiao/archive/2013/04/18/3027971.html Fiddler是用C#开发的。 所以Fiddler不能在Mac系统中运行。 没办法直接用Fiddler来截获MAC系统中的HTTP/HTTPS, Mac 用户怎么办呢? Fiddler可以允许“远程连接”。 我们可以利用这个间接来实…

她花了8个月让骗子爱上自己,然后把骗子引到警察局......

1 相信你一定可以的(素材来源网络,侵删)▼2 凤凰传奇的buff有多强?(via.段子楼,侵删)▼3 老板的名字实在太有味道了(素材来源网络,侵删)▼4 被微信骰子气死…

mysql配置-django

mysql配置-django (python) 数据库配置 像前面章节提到的 模版路径一样,数据库配置也是在Django的配置文件里,缺省 是 settings.py 。 打开这个文件并查找数据库配置: DATABASES {default: {ENGINE: django.db.backends.sqlite3,…

精彩回顾|2021 中国 .NET 开发者峰会

.NET Conf China 2021 是面向开发人员的社区峰会,基于 .NET Conf 2021,庆祝 .NET 6 的发布和回顾过去一年来 .NET 在中国的发展。峰会由来自北京、上海、苏州、深圳、武汉、广州、青岛、烟台、杭州等各地区的 .NET 技术社区共同发起举办,由微…

wms地图绘制工具_移情地图,了解用户需求的利器

如果你想打造一款成功的产品,对你的用户有一个良好的了解是至关重要的。虽然用户体验设计师有许多技能可以帮助他们发展这种理解,但有一种关键技能有很多优势,它称为移情地图。User-Experience Quiz: 2018 UX Year in Review(NN/g)中有一题问…

linux之openssl简单介绍

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。在OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站使用名为OpenSSL的开源软…

把准脉搏 U-Mail邮件系统2014开足马力

为什么80%的码农都做不了架构师?>>> 马年春节即将来临,在过去的一年,U-Mail邮件服务器从用户需求出发,围绕着为用户打造稳定、安全、高效、易操作、助管理的邮件系统目标,三军用命,取得了不俗业…

kdbchk: the amount of space used is not equal to block size

一.对数据文件检查 注意:应该在关闭数据库模式下进行bbed的操作 [oracleora10 controlfile]$ dbv file/u01/app/oracle/oradata/ORCL/datafile/test_01.dbf blocksize8192DBVERIFY: Release 10.2.0.1.0 - Production on Fri Jan 16 23:05:01 2015Copyright (c) 198…

Maven私服的简单搭建教程(Nexus)

2019独角兽企业重金招聘Python工程师标准>>> 第一步,下载nexus的安装包并解压 链接:http://pan.baidu.com/s/1jIhpZ98 密码:6bqx 如果不能下载给我私信,最近也一直在想把这些东西方github上,但是想想自己老…

linux之修改dns以及用netmask修改ip和网关

1、介绍netmask netmaks可以在 IP范围、子网掩码、cidr、cisco等格式中互相转换,并且提供了IP地址的点分十进制、16进制、8进制、2进制之间的互相转换! 2、安装netmask sudo apt-get install netmask 3、修改ip 把ip修改成192.168.1.18 ifconfig eth0 1…

如何使用 .NET 实现高效的网络连接性检查?

咨询区 Mohit Deshpande我的项目有一个需求,需要检查网络的连通性,请问是否有高效的方式去实现?回答区 Leo虽然并不能完全可靠的实现网络连通性检查,因为你不能保证目标机永远在线,相比来说更高效的方式是用 Ping协议 …

el-popover超过固定高度后出现滚动条_「测绘精选」RTK测量不出现固定解的原因...

摘要:在日常RTK测量的应用中,时常不出现固定解的情况,导致测量测绘工作无法按时完成或者测量测绘结果精度无法保证。本文将从基准站、移动站、数据链等三个方面进行分析。随着卫星定位技术的快速发展,人们对快速高精度位置信息的需…

史上最牛物理科普

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

在Android中afinal框架下实现sqlite数据库版本升级的办法

上一篇文章采用的是SQLiteOpenHelper中的onUpgrade方法实现数据库的升级。 首先获取Context: private Context mContextthis; 然后实现FinalDb内的静态方法: FinalDb.create(mContext,"afinal.db",true,2,this); 实现FinalDb的DbUpdateListe…

MySQL备份原理详解

备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低。衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(RTO),前者重点关…

计时器小程序——由浅入深实例讲解

本菜在实现简单的计时器过程中遇到问题的一些成长笔记,有不完整观点的话请多多见谅,也看了众多大神的博客才整理的笔记,下面来实现个人写的小程序。 首先第一个实例(很简单): winform窗体包含两个控件&…

linux c之通过管道实现兄弟间进程通信:

1、兄弟间进程通信: 父进程创建管道,并使用fork函数创建2个进程,在第一个子进程发消息到第二个子进程,第2个子进程读取消息并处理,在父进程中不使用管道通信,所以什么都不做,直接关闭管道两端并…