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!

浙公网安备 33010602011771号