leetcode 5 最长回文子串

双指针法
通过遍历中心值(字符串中的每一个值),左右指针分别移动判断是否会形成回文字符串,同时记录最大长度的回文字符串。

class Solution:
    def longestPalindrome(self, s: str) -> str:

        size = len(s)
        # 特殊处理
        if size == 1:
            return s
        maxlen=0
        start=0
        length=1

        for i in range(size):
            left=i-1
            right=i+1
            while left>=0 and s[left]==s[i]:
                print(s[i])
                length+=1
                left-=1
            while right<size and s[right]==s[i]:
                print(s[i])
                length+=1
                right+=1
            while left>=0 and right<size and s[left]==s[right]:
                print(s[i])
                length+=2
                left-=1
                right+=1
            if  length>maxlen:

                maxlen=max(maxlen,length)
                start=left
            length=1

        return s[start+1:start+maxlen+1]

通过动态规划方法,通过枚举字符串的首尾字符,主要是尾字符从1到len(s),长度在2-3的,如果首尾字符相同,那么将动态规划表中填入True(初始化为False),如果长度长于此的,那么就先判断首尾字符,在判断中间字符串。最后需要记录长度,和初始值。
通过初始值和长度来得到最终的结果。

class Solution:
    def longestPalindrome(self, s: str) -> str:

        size = len(s)
        # 特殊处理
        if size == 1:
            return s
        maxlen=1
        start=0

        dp=[[ False for _ in range(size)] for _ in range(size)]       

        for j in range(1,size):
            for i in range(j):
                if j-i<=2:
                    if s[i]==s[j]:
                        dp[i][j]=True

                else:
                    if s[i]==s[j]:
                        if dp[i+1][j-1]==True:
                            dp[i][j]=True
                if dp[i][j] == True and j-i+1>maxlen:
                    maxlen=j-i+1
                    start=i 

        return s[start:start+maxlen]

动态规划,这次遍历是通过长度,先算出长度为1的字符串在dp数组中的值,再计算长度为2,3...
对于原始方法时间复杂度O(n^2)超时,对循环条件进行改善的同时,也需要注意构建二维数组时,也是O(n^2)的时间复杂度。
需要更改成[[0]*n for _ in range(n)]

class Solution:
    def longestPalindrome(self, s: str) -> str:

        size = len(s)
        # 特殊处理
        if size == 1:
            return s
        ans=""

        dp=[[ False ]*size for _ in range(size)]



        for l in range(1,size+1):
            for i in range(size-l+1):
                j=i+l-1


                if l==1:
                    dp[i][j]=True

                    if s[i]==s[j]:
                        dp[i][j]=True

                else:
                    if s[i]==s[j]:
                        if dp[i+1][j-1]==True:
                            dp[i][j]=True

                if dp[i][j] == True and l>len(ans):
                   ans=s[i:j+1]

        return ans


动态规划 文章被收录于专栏

给自己归纳复习的一些做过的题目,写得很乱,大家可以按照这个题目去针对性做题,确实会有提升!

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务