算法刷题-python版-最大回文子串
创始人
2024-05-29 19:06:58
0

文章目录

  • 回文字符串
  • 如何判断是回文字符串
  • 求解字符串的最大回文子串
    • 暴力求解
    • 中心扩展(比较优的方式)
    • 两种方式性能对比

回文字符串

正读、反读都是同一个字符串本身,这样的字符串就是回文字符串。
如 abccba 是回文字符串;
而 abcd 却不是回文字符串
 

如何判断是回文字符串

字符串的
第一个位置与最后一个位置字符相同;
第二个位置与倒数第二个位置字符相同;
依次类推…
满足这样的要求的就是回文字符串。

代码实现,判断是否为回文字符串

# __author__ = "laufing"def is_palindrome(target_s: str) -> bool:""" 是否回文字符串  两边对称 """if len(target_s) < 2:return Truen = len(target_s)for i in range(n//2):# 取第一个字符 与 最后一个字符比较if target_s[i] == target_s[n - i - 1]:continueelse:return Falseelse:return Trueif __name__ == '__main__':s = "abccba"print(is_palindrome(s))

 

求解字符串的最大回文子串

给定一个字符串,求解其最大的回文子串。

例子1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

例子2:
输入: “abaelele”
输出: “elele”

暴力求解

暴力求解思路
列出目标字符串的所有的子串,根据长度从大到小,依次循环判断每个子串是否为回文字符串,找到则停止。
在这里插入图片描述

# 暴力求解
def find_max_palindrome(target_s: str) -> str:if len(target_s) < 2:return target_sresult = ""n = len(target_s)for i in range(n, 0, -1):for j in range(n + 1 - i):sub_str = target_s[j:j+i]if is_palindrome(sub_str):result = sub_strreturn result# 时间复杂度O(n^3)  空间复杂度O(1)

 

中心扩展(比较优的方式)

思路
从左到右依次遍历字符串的每个字符,每个字符向两边扩展,只要最内部不是回文,则后续的扩展也不可能是回文;继续遍历下一个字符。


# 中心扩展法
def center_expand(target_s: str) -> str:if len(target_s) < 2:return target_sn = len(target_s)result = ""for i in range(n):# 奇数回文temp1 = do_expand(target_s, i, i)# 偶数回文temp2 = do_expand(target_s, i, i + 1)if len(temp1) > len(result):result = temp1if len(temp2) > len(result):result = temp2return result# 核心部分 
def do_expand(target_s, left, right):""" 两边扩展: left 左边索引; right右边索引 """while left >= 0 and right < len(target_s) and target_s[left] == target_s[right]:left -= 1right += 1return target_s[left + 1 : right]

两种方式性能对比

# timeit测试性能
from timeit import Timer
# s = "abadcaacdele"
s = "abaelele"
timer1 = Timer("find_max_palindrome(s)", globals=globals()) # 测试是在另一个位置,
# 所以查找函数及参数需要指定globals()
timer2 = Timer("center_expand(s)", "from __main__ import center_expand, s") # 也可导入
t1 = timer1.repeat(5, 10000) # 重复测试5次(timeit),每次执行1000次的时间
t2 = timer2.repeat(5, 10000)
print("暴力求解性能:", t1)
print("中心扩展性能:", t2)

在这里插入图片描述
此时暴力求解的性能还略优于中心扩展法,这个是与最大回文子串的长度有关系的,当最大回文子串的长度与目标字符串的总长度相差大的时候,暴力求解就的劣势就会显示出来。
如求解 s = "ipqabadcaacdeleffggklmen"这个字符串的最大回文子串,性能对比如下:
在这里插入图片描述
此时,暴力求解占用时间明显增多,中心扩展法性能高出很多。
总结:中心扩展法是比较优的解法。

相关内容

热门资讯

尚德教育的老师教的怎么样? 尚德教育的老师教的怎么样?尚德教育机构有他们独有的教育方式,直播课程可以互动,没听懂的可以看回放反复...
真三赵云龙之心怎么合成 真三赵云龙之心怎么合成真三赵云龙之心怎么合成杀黄龙掉出来的。不过杀黄龙需要一些装备建议在单人模式下练...
小冰 和 小兵 的英文分别怎么... 小冰 和 小兵 的英文分别怎么写?拜托了各位 谢谢little ice little solder ...
进监狱为什么会被其他的犯人打? 进监狱为什么会被其他的犯人打?为什么呢?因为他们和大家一样相信弱肉强食的丛林法则!!!让你看看他们有...
有一本小说女主角叫林小溪男主角... 有一本小说女主角叫林小溪男主角叫李什么琛一不小心爱上总裁作者:聿天使主角:林小溪,李聿旻你问错地方了
百万新娘之爱无悔英杰是敏君亲生... 百万新娘之爱无悔英杰是敏君亲生的吗王英杰是林敏君跟王绍华的儿子,五十九集说了:王英杰是:林敏君、王绍...
女人在恋爱中通常有哪些误区?如... 女人在恋爱中通常有哪些误区?如何避免?女人在恋爱中误区有付出的多少与爱的程度为正比,如果你总觉得如果...
俩人去马尔代夫旅行结婚需要多少... 俩人去马尔代夫旅行结婚需要多少钱?从天津到马尔代夫旅行结婚需要多少钱 什么时候去合适 待上7天左右 ...
人是不是年龄越大越不敢动感情? 人是不是年龄越大越不敢动感情?人并不是年龄越大越不敢动感情,而是因为年龄越大就看透了这世间所有的感情...
说男主重生如何开加盟鞋店如何赚... 说男主重生如何开加盟鞋店如何赚钱的过程的小说。小说重生之超级商业帝国重生之最强富翁重生1978重生1...
拔萝卜儿歌改编歌曲 拔萝卜儿歌改编歌曲儿歌拔萝卜 拔萝卜. 嗨吆嗨吆,拔萝卜,嗨吆嗨吆,拔不动, 老太婆,快快来,快来帮...
为啥所有的付出再他就是一文不值... 为啥所有的付出再他就是一文不值你人与人之间"心已走远"。。。那就不在付出了,既然看透了,那就没必要付...
贝利亚奥特曼 贝利亚奥特曼贝利亚奥特曼有什么故事?他的性格很不好吗?赛罗奥特曼VS黑暗独眼巨人赛罗大怪兽大战!超银...
找一部日剧~~ 找一部日剧~~之前看到有人推荐过一部日剧,前两个字是“非常”后面几个字我忘了,请问有谁知道吗?应该是...
“一往如初”是什么意思? “一往如初”是什么意思?一往如初是什么意思还是像以前一样。一往:一直,始终。如:像。初:以前那样,一...
闲情倩意后面能连个什么句 闲情倩意后面能连个什么句连词后面也可以加有动词的句子. recoveries accrued to...
世界上最( )的( )... 世界上最( )的( )是世界上最(奇妙)的(感觉)是你爱上一个人的时候.世界上最(舒服)的(...
备胎说车:打蜡 封釉 镀膜 镀... 备胎说车:打蜡 封釉 镀膜 镀晶哪个好常规的保养漆面的方法有打蜡封釉,保持时间长久,和提升漆面的硬度...
下背痛的诊断 下背痛的诊断下背痛的诊断
金鼎猜一个数字 金鼎猜一个数字不知道啊啊啊啊金鼎猜一个数字是9