python练习 之 实践出真知 中心扩展法求最大回文子串 (leetcode题目)

本文介绍了一种在O(n)复杂度内找到字符串中最大回文子串的方法。通过在字符串中插入特殊字符使字符串变为奇数长度,并利用回文串的对称特性进行迭代搜索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 问题,给定一个字符串,求字符串中包含的最大回文子串,要求O复杂度小于n的平方。

    首先需要解决奇数偶数的问题,办法是:插入’#‘,aba变成#a#b#a#,变成奇数个,aa变成#a#a#,变成奇数个。

    其次要解决指导思想问题,这个方法的切入点是奇数的回文字符串具有对称性,就像圆形一样,所以我们就可以迭代圆心,把具有对称性的点到圆心的距离想象成半径。所以需要两个迭代,一个迭代字符串中的点,另一个从半径为1开始,到超出字符串范围为止迭代字符串的半径。

   

#!/usr/binp/python
#!coding=utf-8-

def max_substr(string):
    alist=list(string)
    astr='#'+'#'.join(alist)+'#'
    br=1
    result=''
    point = 0
    for index in range(len(astr)):
        r = longest_r(astr,index)
        if r >= br:
            br=r
            point = index
    for i in astr[point-br:point+br+1]:
        if i != '#':
            result = result + i
    return result


def longest_r(astr,index):
    k=0
    for i in range(1,index+1):    #此处用1不用0的原因是:astr是加过井号的,所以最小的半径是1
        if index+i<len(astr) and index-i>=0 and astr[index-i]==astr[index+i]:
            k+=1
        else:
            break
    return k

if __name__ == "__main__":
    result1=max_substr('a')
    print result1
2 优化

    上面程序的思想是,在for index in range(len(string))的index中迭代i(也就是半径)每个index都从半径为1开始迭代,直到求出最大的半径,然后返回最大半径对应的点,切片求出回文子串。

    如果想优化的话,可以尝试标记目前已知的最大半径,然后index迭代的时候判断如果按照目前的最大半径切片,其是否是回文字符串,如果是,半径加1继续迭代,并且更新目前已知的最大半径,如果不是,那就迭代下一个index,直到最后。

    

 

转载于:https://www.cnblogs.com/0-lingdu/p/9325771.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值