题目链接在这里:5. 最长回文子串 - 力扣(LeetCode)
首先肯定是个n^2的算法,枚举起点也是必要的,但是枚举终点很显然不行,但是考虑到回文串会向下兼容,因此我们可以枚举长度,这就是典型的区间dp了,从短的子串可以推到长的子串的信息的可以用区间dp做。
1 class solution: 2 def longest(self,s : str)->str: 3 ans = 0 4 lft = rgt = 0 5 n = len(s) 6 f=[[False] * n for _ in range(n)] 7 ans = 1 8 for i in range(n): 9 f[i][i] = True 10 for i in range(n-1): 11 if s[i] == s[i+1] : 12 f[i][i+1] = True 13 ans = 2 14 lft = i 15 else: 16 f[i][i+1] = False 17 for length in range(3, n+1): 18 for i in range(n-length+1): 19 j = i+length - 1 20 # print(i,j) 21 if s[i] == s[j]: 22 f[i][j]=f[i+1][j-1] 23 if f[i][j]==True: 24 ans = length 25 lft = i 26 return s[lft: lft+ans] 27 28 if __name__=="__main__": 29 s = "ccc" 30 an = solution.longest(self=0,s=s) 31 print(an)
未来是什么样,未来会发生什么,谁也不知道。
但是我知道,
起码从今天开始努力,
肯定比从明天开始努力,
要快一天实现梦想。
千里之行,始于足下! ——《那年那兔那些事儿》