Loading

Leetcode - 5. 最长回文子串

给你一个字符串s,找到s中最长的回文子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

示例 3:

输入:s = "a"
输出:"a"

示例 4:

输入:s = "ac"
输出:"a"

提示:

1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

「超时」解1 2021/8/23 O(n2)

### Wrong Answers
# 1. abcda

### Time Out
# 1. dddddddddddddddd....  1000个d

import numpy as np

def longestPalindrome(s: str) -> str:
    # 最值问题,用dp做是合适的,
    # 用dp[x][y]表示s[x:y+1]切片是不是回文,是:1;不是:0,
    # 然后纸上画出来,手动推,不手动推脑子想,是搞不理清的,
    # 初值,就是斜对角,
    # 例:babad
    # 0 1 2 3 4
    # b a b a d
    # -------------------------
    # / 0   1   2   3   4
    # 0 1   ①  ⑤
    # 1     1   ②  ⑥
    # 2         1   ③
    # 3             1   ④
    # 4                 1
    # 实际手推,就会发现,遍历的过程是上面斜着遍历的,
    # 得到推导式:
    #            /- 1, (dp[x+1][y-1]==1 and)(如果存在中间这段的话) s[x]==s[y]
    # dp[x][y] =
    #            \- 0, else
    # 而且,dp数组只存在右上角,因为切片,y在x右边

    # 处理掉最简单的情况,题限制了s非空,处理掉长度是1、2的情况
    size = len(s)
    if size == 1: return s
    if size == 2: return s[0:1] if s[0] != s[1] else s
    # 用来记录最长回文的左右下标
    ### Wrong Answer - 1 ###
    # l=r=-1
    l=r=0
    ### Wrong Answer - 1 ###
    dp = np.zeros(shape=(size,size),dtype=int)
    for x in range(0,size):
        dp[x][x]=1
    x=0;y=1
    while True:
        if s[x]==s[y]:
            if (y-1 >= x+1):
                dp[x][y]=1 if dp[x+1][y-1]==1 else 0
            else:
                dp[x][y]=1
        else:
            dp[x][y]=0
        # 如果dp[x][y]=1,更新一下l和r
        if dp[x][y]==1:
            if y-x>r-l: l=x;r=y
        # 暂时存一下x,y计算需要用
        tmp=x
        x=x+1 if y<size-1 else 0
        y=y+1 if y<size-1 else size-tmp
        if y==size: break
    # print(dp)
    # print(s[l:r+1])
    return s[l:r+1]

if __name__ == '__main__':
    # bab/aba
    print(longestPalindrome("babad"))
    # bb
    print(longestPalindrome("cbbd"))
    # a
    print(longestPalindrome("a"))
    # a
    print(longestPalindrome("ac"))
    # aa
    print(longestPalindrome("aa"))

    ### Wrong Answers
    # Wrong Answer - 1
    # a
    print(longestPalindrome("abcda"))

    ### Time Out
    # Time Out - 1
    # dddddddddddddddd....  1000个d
    str='d'*1000
    print(longestPalindrome(str))

Case: 'd'*1000
本地运行,统计时间,770ms!

posted @ 2021-08-22 21:45  wwcg2235  阅读(60)  评论(0)    收藏  举报