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

相关内容

热门资讯

红利浪潮动能澎湃:深市800余... 随着2024年年报披露进入高峰期,深市公司在陆续公布2024年度经营“成绩单”的同时,也给出了真金白...
海 利 得:关于公司新一代光伏... 每经AI快讯,有投资者在投资者互动平台提问:董秘您好,贵公司说光伏膜产品已完成第三代技术迭代,同比第...
中央气象台4月21日10时继续... 转自:中央气象台中央气象台4月21日10时继续发布强对流天气蓝色预警:预计4月21日14时至22日1...
市场监管总局修订《采用国际标准... 格隆汇4月21日|据市场监管总局,日前,市场监管总局修订出台《采用国际标准管理办法》,将于2025年...
广西出现今年首场超警洪水! 记者从广西壮族自治区水文中心获悉,4月20日8时至21日8时,据水文监测,贺州、河池、梧州、百色及桂...
今天起,报名→ 转自:微言教育此次面试在31个省(自治区、直辖市)举办,各省(自治区、直辖市)的报名公告将陆续上网,...
乐普医疗(300003.SZ)... 2025年4月19日,乐普医疗(300003.SZ)发布2024年年报。公司营业总收入为61.03亿...
儿童怎样运动最能“蹿个子” 春暖花开,万物生长。都说春天是孩子最能长高的季节,真的是这样吗?怎样运动才最能“蹿个子”?近日,记者...
中央气象台4月21日10时继续... 转自:中央气象台中央气象台4月21日10时继续发布暴雨蓝色预警:预计,4月21日14时至22日14时...
甘肃省临泽县新华镇市场监管所开... 中国质量新闻网讯 “五一”劳动节将至。连日来,甘肃省临泽县新华镇市场监督管理所结合辖区监管实际,开展...
三晖电气涨2.06%,成交额2... 4月21日,三晖电气盘中上涨2.06%,截至11:07,报14.35元/股,成交2792.49万元,...
北京电子城高科发行10.8亿元... 观点网讯:4月21日,北京电子城高科技集团股份有限公司公告了2025年度第一期中期票据(品种一)和(...
前2月我国原油进口量下降5%   中化新网讯 日前,中国五矿化工进出口商会发布1—2月我国原油进口情况显示,1—2月,我国原油进口...
擦不掉,根本擦不掉!女子家门口... “被家门口的树暗算了。一大早,想骑个共享单车出门,坐凳上、车把手上都是黏糊糊的点点。餐巾纸根本擦不掉...
三连冠!泰安市体校男篮勇夺省篮... 转自:泰安发布近日,从2025年山东省篮球锦标赛暨山东省第二十六届运动会篮球积分赛(男子甲组)赛场传...
华翔股份跌2.00%,成交额4... 4月21日,华翔股份盘中下跌2.00%,截至11:06,报15.18元/股,成交4937.01万元,...
国产电影票房前十中四部为京产 来源:北京日报 北京日报讯(记者王金跃)在第15届北京国际电影节中国电影高质量发展论坛上,北京电影家...
皖新传媒涨2.13%,成交额5... 4月21日,皖新传媒盘中上涨2.13%,截至11:12,报6.70元/股,成交5744.65万元,换...
热搜!京东宣布:招聘10万名全... 炸锅了。4月21日,京东发布《致全体外卖骑手兄弟们的公开信》,针对部分平台强迫外卖骑手“二选一”、不...
安诺其涨2.14%,成交额1.... 4月21日,安诺其盘中上涨2.14%,截至10:56,报5.25元/股,成交1.10亿元,换手率2....