算法刷题-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"这个字符串的最大回文子串,性能对比如下:
在这里插入图片描述
此时,暴力求解占用时间明显增多,中心扩展法性能高出很多。
总结:中心扩展法是比较优的解法。

相关内容

热门资讯

你的晚安是我的早安是什么歌曲 你的晚安是我的早安是什么歌曲苏天伦《你的早安是我的晚安》“你的晚安是我的早安”是单小源的歌曲《东京遇...
积极进取的小故事 积极进取的小故事现代的普通人,不要名人的。不能与别人重复,尽快回答   啄木鸟的故事       啄...
熊出没之探险日记3什么时候播出... 熊出没之探险日记3什么时候播出?熊出没之探险日记3,春节前播放。熊出没只是探险日记三2020年5月4...
谁知道所有有关“七”的歌?拜托... 谁知道所有有关“七”的歌?拜托了各位 谢谢就是歌曲名里有“七”这个字的!谢谢七月七迅谈日晴 看我七十...
求一本小说 女主穿越了三次 每... 求一本小说 女主穿越了三次 每次都在福临身边 后来怀孕了孩子被打掉了那个 女主叫什么雯?那个女主就是...
如果记忆不说话,流年也会开出花... 如果记忆不说话,流年也会开出花的基本信息书 名:《如果记忆不弯饥好说话,流年也会开出花》埋铅 作 者...
你好,旧时光漫画版在哪里可以看... 你好,旧时光漫画版在哪里可以看?暂时在绘心上连载
一首英文歌,男的组合唱的,MV... 一首英文歌,男的组合唱的,MV是一个婚礼的过程。求歌名。是不是darin的can'tstoplove...
为什么很多人喜欢用胶片相机? 为什么很多人喜欢用胶片相机?有一种情怀叫做“怀旧“吧,现在数码相机越来越普遍了,已经到了”全民摄影“...
女主先爱上男主,男主却不喜欢女... 女主先爱上男主,男主却不喜欢女主或者是另有所爱,最后女主男主还是在一起的穿越小说。有木有再生缘:我的...
爱情失恋伤感句子 爱情失恋伤感句子越是美好的从前,越幸福的曾经,现在只能带来锥心的疼痛,痛到撕心裂肺,肝肠寸断,终于痛...
24岁穿这个会不会显老 24岁穿这个会不会显老有点显老,这个颜色款式,颜色有点暗,没有活力,属于那种气质佳,长得高雅的女人,...
哈尔的移动城堡英语版 哈尔的移动城堡英语版可以发给我吗度盘~请查收~
秦时明月之万里长城什么时候播 秦时明月之万里长城什么时候播据说是今年暑假开播别急,官网什么的信他你就输了,12年之前底应该会出,杭...
孩子会得抽动症吗? 孩子会得抽动症吗?我天生的气性比较大,有时跟别人斗嘴时候就会手脚哆嗦,麻木,我问一下这是不是抽动症就...
亨德尔一生为音乐献出了怎样的贡... 亨德尔一生为音乐献出了怎样的贡献?亨德尔一生写了歌剧41部,清唱剧21部,以及大量的管乐器与弦乐器的...
礼仪起源和发展的经典故事? 礼仪起源和发展的经典故事?一、礼仪的起源;1、天神生礼仪;2、礼为天地人的统一体;3、礼产生于人的自...
描写桂林山水的句子有哪些? 描写桂林山水的句子有哪些?天下风光数桂林有杨万里的“梅花五岭八桂林,青罗带绕碧玉簪”;有邹应龙的“无...
避免与强敌正面对决的成语 避免与强敌正面对决的成语避免与强敌正面对决的成语避实就虚 【近义】避重就轻、避难就易、声东击西【反义...
多愁善感类的成语 多愁善感类的成语心细如发【解释】:极言小心谨慎,考虑周密。亦作“心细于发”。【出自】:吴梅《题天香石...