代码随想录算法训练营第五十七天 647. 回文子串、516.最长回文子序列、动态规划章节总结

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

代码随想录算法训练营第五十七天 | 647. 回文子串、516.最长回文子序列、动态规划章节总结

647. 回文子串

题目链接:647. 回文子串 - 力扣(LeetCode)

// dp法
class Solution {public int countSubstrings(String s) {int len = s.length();int count = 0;/**当s[i] != s[j]时,那没啥好说的了,dp[i][j]一定是false。当s[i] == s[j]时,这就复杂一些了,有如下三种情况情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串情况二:下标i 与 j相差为1,例如aa,也是回文子串情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true*/// dp[i][j] 表示子字符串(下表范围[i, j])) 是否是回文boolean[][] dp = new boolean[len][len];// 初始化 :dp[i][j] 全部初始化为falsefor(int i = len - 1; i >= 0; --i) {for(int j = i; j < len; ++j) {// 只有在这种情况下,才能if(s.charAt(i) == s.charAt(j)) { // 情况一 和 情况二if(j - i <= 1) {dp[i][j] = true;count++;// 情况三} else if (dp[i+1][j-1]) {dp[i][j] = true;count++;}}}}return count;}
}// 双指针法
}class Solution {public int countSubstrings(String s) {int len, ans = 0;if (s == null || (len = s.length()) < 1) return 0;for(int i = 0; i < len; ++i) {ans += extend(s, i, i, len); // 以i为中心点ans += extend(s, i, i+1, len); // 以i和i+1为中心点}return ans;}int extend(String s, int i, int j, int n) {int res = 0;while (i >= 0 && j < n && s.charAt(i) == s.charAt(j)) {i--;j++;res++;}return res;}
}

516.最长回文子序列

题目链接:516. 最长回文子序列 - 力扣(LeetCode)

class Solution {public int longestPalindromeSubseq(String s) {int len = s.length();// dp[i][j] 表示 [i, j] 范围中最长的回文子序列长度int[][] dp = new int[len][len];for(int i = len - 1; i >= 0; --i) {dp[i][i] = 1; // 初始化for(int j = i + 1; j < len; ++j) {if(s.charAt(i) == s.charAt(j)) {dp[i][j] = dp[i+1][j-1] + 2; // 相等时,可以使[i+1,j-1]内最长回文子序列的长度+2} else {dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]); // 不相等,则只能在[i+1, j]和[i, j-1]中选一个最长的回文子序列长度}}}return dp[0][len - 1];}
}

动态规划章节总结

动规五部曲分别为:

  1. 确定dp数组(dp table)以及下标的含义

  2. 确定递推公式

  3. dp数组如何初始化

  4. 确定遍历顺序

  5. 举例推导dp数组

  • 背包问题
  • 打家劫舍系列
  • 股票系列
  • 子序列系列

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



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

相关文章

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

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

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

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

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

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. 缓存配置方案方案