回文子列 -- 连续与不连续
题目:
- 647 回文子串 https://leetcode.cn/problems/palindromic-substrings/description/
讲解: https://programmercarl.com/0647.%E5%9B%9E%E6%96%87%E5%AD%90%E4%B8%B2.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE - 5 最长回文子串 https://leetcode.cn/problems/longest-palindromic-substring/description/
- 516 最长回文子序列 https://leetcode.cn/problems/longest-palindromic-subsequence/description/
1. 统计回文子串的数目
题目:给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
思路:
- 使用动态规划来解决,定义二维数组
dp
表示从i
到j
的子串是否为回文子串。 - 初始化所有长度为 1 的子串都是回文子串,即
dp[i][i] = true
。 - 状态转移方程:
dp[i][j] = s[i] == s[j] && dp[i+1][j-1]
,即当前子串是否为回文取决于首尾字符是否相等且去掉首尾后的子串是否为回文。 - 统计回文子串的数量,如果
dp[i][j]
为 true,则回文子串数量加一。
代码:
2. 找到最长回文子串
题目:给你一个字符串 s,找到 s 中最长的回文子串。
思路:
- 使用动态规划来解决,定义二维数组
dp
表示从i
到j
的子串是否为回文子串。 - 初始化所有长度为 1 的子串都是回文子串,即
dp[i][i] = true
。 - 状态转移方程:
dp[i][j] = s[i] == s[j] && dp[i+1][j-1]
,即当前子串是否为回文取决于首尾字符是否相等且去掉首尾后的子串是否为回文。 - 在状态转移的过程中,记录最长的回文子串的起始位置和长度。
代码:
3. 找到最长回文子序列
- 使用动态规划来解决,定义二维数组
dp
表示从i
到j
的子序列的最长回文长度。 - 初始化所有长度为 1 的子序列的最长回文长度为 1。
- 状态转移方程:
dp[i][j] = dp[i+1][j-1] + 2
,即当前子序列的最长回文长度取决于首尾字符是否相等且去掉首尾后的子序列的最长回文长度加 2。 - 优化 改用一维dp 需加入临时变量记录过程值
- 在状态转移的过程中,记录最长的回文子序列的长度。
代码:
一维dp
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
#一维dp
n = len(s)
# 创建一维动态规划数组 dp,表示以当前索引 i 结尾的最长回文子序列的长度
dp = [0] * n
for i in range(n - 1, -1, -1):
# 初始化当前位置 i 的最长回文子序列长度为 1
dp[i] = 1
# 用于保存 dp[i+1][j],即上一行同一列的值
pre = 0
for j in range(i + 1, n):
# 保存当前 dp[j],即当前行上一列的值
tmp = dp[j]
dp[j] = pre + 2 if s[i] == s[j] else max(dp[j], dp[j - 1])
# 更新 prev,为下一轮迭代保存 dp[i+1][j]
pre = tmp
return dp[-1]
在这三个问题中,主要区别在于动态规划数组的定义和状态转移方程的不同。
__EOF__

本文作者:小苔藓
本文链接:https://www.cnblogs.com/taixian/p/18020798.html
关于博主:计算机本科生一枚,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/taixian/p/18020798.html
关于博主:计算机本科生一枚,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗