最大回文子串

1.暴力法

求出每个子串,之后判断是不是回文,找到最长的那个。

def find_longest_palindromes(s):
    maxLength = 0
    start = 0
    for i in range(len(s)):
        for j in range(i+1, len(s)):
            temp1 = i
            temp2 = j
            while temp1 < temp2:
                if s[temp1] != s[temp2]:
                    break
                temp1 += 1
                temp2 -= 1
            if temp1 >= temp2 and j - i > maxLength:
                maxLength = j - i + 1
                start = i
    if maxLength > 0:
        print maxLength
        print s[start:start+maxLength]

2.动态规划

回文字符串的子串还是回文,如p[i,j]是回文,则p[i+1,j-1]也是回文,需要额外空间O(N^2),时间复杂度O(N^2)
p[i,j]=0: 表示子串[i,j]不是回文串,=1:表示子串[i,j]是回文串
p[i.j] = p[i+1,j-1] if s[i] == s[j]
= 0 if s[i] != s[j]

def find_longest_palindrome_dp(s):
    n = len(s)
    longest_begin = 0
    max_len = 1
    dp = [[0] * (n) for i in range(n)]
    for i in range(n):
        dp[i][i] = 1

    for i in range(n-1):
        if s[i] == s[i+1]:
            dp[i][i+1] = 1
            longest_begin = i
            max_len = 2
    for le in range(3,n+1):
        for i in range(0, n - le + 1):
            j = i + le - 1
            if s[i] == s[j] and dp[i+1][j-1]:
                dp[i][j] = 1
                longest_begin = i
                max_len = le
    return s[longest_begin:longest_begin+max_len]

3.中心扩展法


# 时间复杂度O(N^2),空间复杂度O(1)
# 就是对给定的字符串S,分别以该字符串S中的每一个字符C为中心,向两边扩展,
# 记录下以字符C为中心的回文子串的长度,
# 需要注意的是,回文可能是aba,也可能是abba

4.Manacher算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值