代码随想录算法训练营第五十七天|647 回文子串 516.最长回文子序列

本文主要是介绍代码随想录算法训练营第五十七天|647 回文子串 516.最长回文子序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

647. 回文子串

https://leetcode.com/problems/palindromic-substrings/

思路: 当我们看到两个下标 i, j 上 s[i] != s[j], 那么 s[i: j+1] 一定不是回文子串。 如果s[i] == s[j], 那么我们可以在检查 s[i+1: j] 是不是回文串。如果暴力搜索的话是 O(n^3) 的时间复杂度。 我们可以用一个二维 dp 数组记录s[i: j+1] 是不是回文串。 然后用 一个 visited 数组记录我们是不是已经经历过 i,j 的组合。 然后开始深度优先搜索, 如果visited[i][j] == 1, 我们直接返回 dp[i][j].  然后如果visited[i][j] == 0, 我们碰到 s[i] != s[j], 那么 visited 数组变成 1, dp 数组填0. 如果我们碰到s[i] == s[j] 并且 j-i < 2, 那么visited 数组标记为1, dp 数组为1.  如果s[i] == s[j] 并且 j-i >= 2, 然后我们搜索 s[i+1: j]. dp[i][j] 等于搜索的返回值。 

难点: 如何降低时间复杂度。 

class Solution:def countSubstrings(self, s: str) -> int:matrix = [[0] * len(s) for _ in range(len(s))]visited = matrix.copy()def fds(s: str, i: int, j: int):if visited[i][j]:return matrix[i][j]visited[i][j] = 1if s[i] != s[j]:matrix[i][j] = 0elif s[i] == s[j] and j - i <= 1:matrix[i][j] = 1else:matrix[i][j] = fds(s, i+1, j-1)return matrix[i][j]for i in range(0, len(s)):for j in range(i, len(s)):fds(s, i, j)return sum([sum(x) for x in matrix])

516.最长回文子序列

https://leetcode.com/problems/longest-palindromic-subsequence/description/

思路: 这个问题和上一个问题挺类似的。 不同点在于回文子序列是要考虑不连续的情况。 如果是回文串, 直接用上一题的代码, 最后找出 max(j-i)。  如果是序列, 其实就是找到 s 和 s[::-1]的最长公共子序列。 不过这个问题不转换成 LCS 也可以直接解决。 考虑dp[i][j] 表示 s[i: j+1] 的最长回文子序列长度。 如果 s[i] != s[j], 那么dp[i][j] = max(dp[i+1][j], dp[i][j-1]). 如果 s[i] == s[j], 那我们再分情况, j - i < 2, dp[i][j] = j - 1 +1. 如果 j - i >= 2, dp[i][j] = dp[i+1][j-1] + 2. 这里注意递推的顺序, 所以 循环的时候 i 从 len(s-1) 到 0, j 从 i 到 len(s-1), 保证用递推关系的时候, 前置的状态已经计算过了。 

难点: 注意一下循环的顺序

class Solution:def longestPalindromeSubseq(self, s: str) -> int:dp = [[0] * len(s) for _ in range(len(s))]for i in range(len(s)-1, -1, -1):for j in range(i, len(s)):if s[i] != s[j]:dp[i][j] = max(dp[i+1][j], dp[i][j-1])elif s[i] == s[j] and j - i < 2:dp[i][j] = j - i + 1else:dp[i][j] = dp[i+1][j-1] + 2return dp[0][len(s)-1]

这篇关于代码随想录算法训练营第五十七天|647 回文子串 516.最长回文子序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845561

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum