算法培训

第一节

最长回文子串

给出一个字符串(假设长度最长为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 先算出来,所以要倒过来循环。

 

 

posted @   bonelee  阅读(1007)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.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一级索引找到真正的值
点击右上角即可分享
微信分享提示