最长回文子串——动态规划

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
"""
给你一个字符串 s,找到 s 中最长的回文子串。
 
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
 
 
 
示例 1:
 
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
 
输入:s = "cbbd"
输出:"bb"
"""
 
def longest_par(s):
    if not s:
        return ""
 
    n = len(s)
    dp = [[False]*n for _ in range(n)]
    ans = s[0]
 
    for i in range(n-1, -1, -1):
        dp[i][i] = True
        if i > 0 and s[i] == s[i-1]:
            dp[i-1][i] = True
            if len(ans) < 2:
                ans = s[i-1:i+1]
 
        for j in range(i+2, n):
            if s[i] == s[j]:
                dp[i][j] = dp[i+1][j-1]
                if dp[i][j] and len(ans) < j-i+1:
                    ans = s[i:j+1]
    return ans
 
print(longest_par("aabba"))
print(longest_par("aabbaa"))
print(longest_par("jbba"))
print(longest_par("jbbaa"))
print(longest_par("jbbjaa"))
print(longest_par(""))
 
<br># 下面是GPT4给的写法,感觉逻辑上比我的更清晰
def longestPalindromeDP(s):
    n = len(s)
    if n == 0:
        return ""
 
    start = 0
    max_len = 1
    dp = [[False] * n for _ in range(n)]
 
    # 单个字符是回文
    for i in range(n):
        dp[i][i] = True
 
    # 两个字符相同是回文
    for i in range(n - 1):
        if s[i] == s[i + 1]:
            dp[i][i + 1] = True
            start = i
            max_len = 2
 
    # 遍历长度大于2的子串
    for length in range(3, n + 1):
        for i in range(n - length + 1):
            j = i + length - 1
            if s[i] == s[j] and dp[i + 1][j - 1]:
                dp[i][j] = True
                start = i
                max_len = length
 
    return s[start:start + max_len]
 
 
# 测试示例
s1 = "babad"
print(longestPalindromeDP(s1))  # 输出:"aba"
 
s2 = "jbbjaa"
print(longestPalindromeDP(s2))

  

posted @   bonelee  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2018-03-24 Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)——无非是在传统遍历过程中修改叶子结点加入后继结点信息(传统是stack记录),然后再删除恢复
2018-03-24 leetcode 538. Convert BST to Greater Tree
2018-03-24 python 闭包变量不允许write,要使用nonlocal
2017-03-24 lucene倒排索引瘦身的一些实验——merge的本质是减少cfx文件 变为pos和doc;存储term vector多了tvx和tvd文件有337M
点击右上角即可分享
微信分享提示