算法培训
第一节
最长回文子串
给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串。
样例
给出字符串 "abcdzdcab"
,它的最长回文子串为 "cdzdc"
。
挑战
O(n2) 时间复杂度的算法是可以接受的,如果你能用 O(n) 的算法那自然更好。
我的n^3代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class Solution: """ @param s: input string @return: the longest palindromic substring """ def longestPalindrome( self , s): # write your code here start, end = 0 , 0 for i in range ( 0 , len (s)): for j in range (i, len (s)): if (j - i)>(end - start) and self .isPalind(s, i, j): start, end = i, j return s[start:end + 1 ] def isPalind( self , s, i, j): while i<j: if s[i] ! = s[j]: return False i + = 1 j - = 1 return True |
从中心点左右遍历的解法,注意回文是奇偶情况,这才是这个题目的关键点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class Solution: """ @param s: input string @return: the longest palindromic substring """ def longestPalindrome( self , s): # write your code here start,end = 0 , 0 n = len (s) def locatePalindrome(s, i, j): nonlocal start,end while i> = 0 and j<n: if s[i] = = s[j]: if end - start < j - i + 1 : start,end = i,j + 1 else : break i - = 1 j + = 1 for i in range (n): # center i locatePalindrome(s, i, i) # center i,i+1 locatePalindrome(s, i, i + 1 ) return s[start:end] |
DP解法:细节有点多,不一定能够写对。。。尤其是那个for是从大到小递减。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Solution: """ @param s: input string @return: the longest palindromic substring """ def longestPalindrome( self , s): # write your code here start = end = 0 n = len (s) dp = [[ False ] * n for _ in range (n)] for i in range (n - 1 , - 1 , - 1 ): # for i in range(0, n) WRONG!!!! for j in range (i, n): if i = = j: dp[i][j] = True else : dp[i][j] = (s[i] = = s[j]) and (j = = i + 1 or dp[i + 1 ][j - 1 ]) if dp[i][j] and (j - i + 1 ) > (end - start): start, end = i, j + 1 return s[start:end] |
Why is it not working if outside loop use for (int i = 0; i < n; i++)?
因为推导公式里 i 依赖于 i+1,所以i+1要比 i 先算出来,所以要倒过来循环。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2017-01-12 cassandra压力测试
2017-01-12 HBase Cassandra比较
2017-01-12 重新认识HBase,Cassandra列存储——本质是还是行存储,只是可以动态改变列(每行对应的数据字段)数量而已,当心不是parquet
2017-01-12 HBase底层存储原理——我靠,和cassandra本质上没有区别啊!都是kv 列存储,只是一个是p2p另一个是集中式而已!
2017-01-12 Cassandra 数据模型设计,根据你的查询来制定设计——反范式设计本质:空间换时间
2017-01-12 Cassandra key说明——Cassandra 整体数据可以理解成一个巨大的嵌套的Map Map<RowKey, SortedMap<ColumnKey, ColumnValue>>
2017-01-12 Cassandra二级索引原理——新创建了一张表格,同时将原始表格之中的索引字段作为新索引表的Primary Key,并且存储的值为原始数据的Primary Key,然后再通过pk一级索引找到真正的值