leetcode 5 Longest Palindromic Substring

Longest Palindromic Substring

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

蛮力肯定超时,直接想DP吧。

【错】使用一个数组l, l[i]记录以s[i]结尾的字符串的最大回文长度。l[i]=i-j+1, if s[i]==s[j], i-l[i-1]-1<=j<i。 对于一部分数据比如bananas,abababa来说是对的,但是还有问题,比如aaabaaaa:当aaabaaa已经是回文的时候,最后一个a==第一个a,回文长度又会+1,但是显然是错误的。。

还是需要用二维数组记录回文的区间。

f[i,j]=true表示i-j是回文。则 f[i,j]=true if (i+1==j and s[i]==s[j]) or (f[i+1][j-1] and s[i]==s[j]). 时间复杂度O(n^2)。

class Solution:
    # @return a string
    def longestPalindrome(self, s):
        if s=='':
            return ''
        maxlen=1
        end=0
        l=len(s)
        f=[[False]*l for i in xrange(l)]
        for i in xrange(l):
            f[i][i]=True
        for i in xrange(l-1,-1,-1):
            for j in xrange(i+1,l):
                if (i+1==j and s[i]==s[j]) or (f[i+1][j-1] and s[i]==s[j]):
                    f[i][j]=True
                    if j-i+1>maxlen:
                        maxlen=j-i+1
                        end=j
        ss=s[end-maxlen+1:end+1]
        # pprint(f)
        # print end-maxlen+1,end,s,ss
        return ss
[注]:第9行,如果写f=[[False]*l]*l,然后for i in range(l): f[i][i]=True,则会全部变成True!

算法对了,但是当len(s)=1000的时候还是超时。。

看了一些其他解答方法====

* 枚举对称轴,分别向两边检验。O(n^2)。

* s的逆序s',转换为求s和s'的最长公共子串,且子串位置需保持一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值