leetcode--5. Longest Palindromic Substring

来源:互联网 发布:流体力学 知乎 编辑:程序博客网 时间:2024/06/02 05:08

题目:5. Longest Palindromic Substring

链接:https://leetcode.com/problems/longest-palindromic-substring/description/

找到给定字符串的最长回文子串。写了O(n^2)的实现,搜了下有O(n)的算法,后面再来补上吧。

python:

class Solution(object):    def longestPalindrome(self, s):        """        :type s: str        :rtype: str        """        if not s:            return 0        delimiter = "#"        s = delimiter + delimiter.join(s) + delimiter        length=len(s)        res=""        ans=""        maxlen=1        for i in range(length):            tempmaxlen=1            left=right=i            while s[left]==s[right]:                if left!=right:                    tempmaxlen+=2                left-=1                right+=1                if left<0 or right>=length:                    break            if tempmaxlen>maxlen:                res=s[left+1:right]                maxlen=tempmaxlen        # print(res)        for char in res.split(delimiter):            ans += (char if char else "")        return ans

O(n)的算法叫Manacher算法,参考其他人的这篇文章:http://blog.csdn.net/dyx404514/article/details/42061017

python:

class Solution(object):    def longestPalindrome(self, s):        """        :type s: str        :rtype: str        """        if not s:            return 0        delimiter = "#"        s = delimiter + delimiter.join(s) + delimiter        s="@"+s+"&"        maxright=midpos=0        length=len(s)        dp=[0]*length        maxlength=1        res=""        for i in range(1,length-1):            if maxright>i:                dp[i]=min(maxright-i,dp[2*midpos-i])            else:                dp[i]=1            while s[i-dp[i]]==s[i+dp[i]]:                dp[i]+=1            if i+dp[i]>maxright:                maxright=i+dp[i]                midpos=i            if dp[i]>maxlength:                res=s[i-dp[i]+1:i+dp[i]]                maxlength=dp[i]        return "".join(res.split(delimiter))