zoukankan      html  css  js  c++  java
  • 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
    既然无论如何时间都会过去,为什么不选择做些有意义的事情呢
  • 相关阅读:
    Ant Design Pro V5 + Django Restful Framework Token认证后台实现(二)
    Ant Design Pro V5 + Django Restful Framework Token认证后台实现(一)
    D365 FO产生随机字符串
    D365 FO Array增加排序
    转:Microsoft Dynamics AX内部版本号概述
    vue 组件通信总结
    脑图
    Flask 和 Django 中间件对比
    k8s 理论知识总结
    Flask 源码简析
  • 原文地址:https://www.cnblogs.com/xiaodongsuibi/p/8742675.html
Copyright © 2011-2022 走看看