• LeetCode Medium:5. 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.

    Example:

    Input: "babad"
    
    Output: "bab"
    
    Note: "aba" is also a valid answer.

    Example:

    Input: "cbbd"
    
    Output: "bb"
    题目的意思是找最大的回文串,回文串有两种:一种是中间无重复的,如“aba”,一种是中间是重复的。比如“xaaaaax”
    二、思路
    我能想到的是暴力解法,将每一个字符都作为回文字符串中心,依次扩展,但是这种算法复杂度很高,如代码longestPalindrome0,而且我没有考虑到中间带重复的,所以没有编译通过,在网上看大神的博客,
    找了两种比较好的做法,代码longestPalindrome1和代码longestPalindrome2,将中间重复的作为一个整体考虑。
    三、代码
    #coding:utf-8
    def longestPalindrome0(s):
        """
        :type s: str
        :rtype: str
        """
    '''
    maxcount = 0
        for i in range(1,len(s)-1):
            count = 0
            j = 1
            curleft = i - j
            curright = i + j
            while s[curleft] == s[curright]:
                j+=1
                count+=1
                curleft-=1
                curright+=1
                if curleft < 0 or curright > len(s) - 1:
                    print('break')
                    break
    
    
            if maxcount < count:
                maxcount = count
                a = curleft + 1
                b = curright
                res = s[a:b:1]
        print(maxcount)
        print(res)
        return maxcount,res
    '''
    
    'https://www.cnblogs.com/chruny/p/4791078.html'
    def longestPalindrome1(s):
        """
        :type s: str
        :rtype: str
        """
        size = len(s)
        if size == 1:
            print(s)
            return s
        if size == 2:
            if s[0] == s[1]:
                print(s)
                return s
            print(s[0])
            return s[0]
        maxp = 1
        ans = s[0]
        i = 0
        while i < size:
            j = i + 1
            while j < size:
                if s[i] == s[j]:
                    j += 1
                else:
                    break
            k = 0
            while i - k - 1 >= 0 and j + k <= size - 1:
                if s[i - k - 1] != s[j + k]:
                    break
                k += 1
            if j - i + 2 * k > maxp:
                maxp = j - i + 2 * k
                ans = s[i - k:j + k]
            if j + k == size - 1:
                break
            i = j
        print(ans)
        return ans
    
    'https://blog.csdn.net/shiroh_ms08/article/details/26094141'
    def longestPalindrome3(s):
        if not s or len(s) == 1:
            return s
        # record the result value
        max_length = 1
        start_index = 0
        end_index = 0
        for i in range(0, len(s)-1):
            count = 1
            # aba
            if s[i] != s[i+1]:
                while i-count >= 0 and i + count < len(s) and s[i-count] == s[i+count]:
                    count += 1
                if (count-1) * 2 + 1 > max_length:
                    max_length = (count-1) * 2 + 1
                    start_index = i - count + 1
                    end_index = i + count - 1
            # xaaaaax
            else:
                count_repeat = 1
                count = 0
                while i+1 < len(s) and s[i] == s[i+1]:
                    i += 1
                    count_repeat += 1
                while i-count_repeat+1-count >= 0 and i + count < len(s) and s[i-count_repeat+1-count] == s[i+count]:
                    count += 1
                if (count-1) * 2 + count_repeat > max_length:
                    max_length = (count-1) * 2 + count_repeat
                    start_index = i - count -count_repeat + 2
                    end_index = i + count - 1
        print(s[start_index:end_index+1])
        return s[start_index:end_index+1]
    
    if __name__ == '__main__':
        s1 = 'dabbac'
        #longestPalindrome1(s1)
        s3 ='axaaaaax'
        longestPalindrome3(s3)
    

     参考博客:

    https://blog.csdn.net/shiroh_ms08/article/details/26094141
    https://www.cnblogs.com/chruny/p/4791078.html
    既然无论如何时间都会过去,为什么不选择做些有意义的事情呢
  • 相关阅读:
    qemuimg convert 转换vmdk 等虚拟机文件到dd
    golang 占位符%d %t %v
    QT插件vs报错。 The system cannot find the path specified. 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(170,5): error MSB6006: “cmd.exe”已退出,代码为 3
    兆芯,ZXC4580
    jenkins 构建任务 —— 微服务依赖其它微服务
    jenkins构建项目后主动杀死进程再重启进程。
    升级jenkins到最新版本,并安装git插件
    golang基础 自定义类型和类型别名(type)
    SpinalWorkshop实验笔记(三)
    SpinalWorkshop实验笔记(一)
  • 原文地址:https://www.cnblogs.com/xiaodongsuibi/p/8742675.html
Copyright © 2020-2023  润新知