当前位置: 首页 > news >正文

*算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列

刷题记录

  • *647. 回文子串
  • *516. 最长回文子序列

*647. 回文子串

leetcode题目地址

dp[i][j]存储 i-j 的子串是否是回文串。使用额外的计数器对回文串个数进行记录。

单个字符本身就是回文子串。当子串长度大于1时,两侧的字符相同,则需要判断中间的子串是否是回文串。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// c++
class Solution {
public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size()+1, vector<bool>(s.size()+1, false));int result = 0;for(int i=s.size()-1; i>=0; i--){for(int j=i; j<s.size(); j++){if(s[i] == s[j]){if(j-i<=1){dp[i][j] = true;result++;}else if(dp[i+1][j-1]) {result++;dp[i][j] = true;}}}}return result;}
};

*516. 最长回文子序列

leetcode题目地址

求的是最长回文子序列而不是子串,因此不需要连续。
dp[i][j]存储的是字符串 s 中 i-j 之间的最长回文子序列长度。

  • 当s[i] != s[j]时,dp[i][j] = max(dp[i][j-1], dp[i+1][j]);
  • 当s[i] == s[j]时,有两种情况:
    • j-i <= 1,即j和i指向同一个字符或相邻的两个字符,则最长子序列长度为1(同一字符)或2(相邻两个字符):
      • dp[i][j] = j - i + 1;
    • j-i > 1,则需要查看中间子串的最长回文子序列的长度,用中间串的最长回文子序列的长度加上当前两个字符(i和j指向的字符)
      • dp[i][j] = dp[i+1][j-i] + 2;

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)

// c++
class Solution {
public:int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.size()+1, vector<int>(s.size()+1, 0));int result = 0;for(int i=s.size()-1; i>=0; i--){for(int j=i; j<s.size(); j++){if(s[i]!=s[j]) dp[i][j] = max(dp[i][j-1], dp[i+1][j]);else{if(j-i<=1) dp[i][j] = j-i+1;else dp[i][j] = dp[i+1][j-1]+2;}if(dp[i][j]>result) result = dp[i][j];}/*// 输出dpfor(int j=0; j<s.size(); j++) cout<<dp[i][j]<<" ";cout<<endl;*/}return result;}
};

动态规划系列完结

相关文章:

  • Pytorch 高效快速加载大规模数据集
  • 控制反转(IOC)与依赖注入(DI)模式解析及实践
  • IAP程序升级 与 电脑BIOS 的关系
  • hashmap底层原理(数据结构 put原理 get原理 remove原理)
  • 【RunAsTool】解锁Windows权限:让管理员权限触手可及
  • 2023/8/7 英语每日一段
  • 智能编程新纪元:腾讯AI代码助手的高效编程体验
  • 【初阶数据结构题目】14.随机链表的复制
  • PHP最新可用获取QQ昵称API接口源码_非第三方
  • python语言day3 元组、字典、类型转换
  • Spring Boot相关知识
  • 自动化专业英语
  • 【Oracle EBS R12】第二章 P2P O2C cycle(英文版)
  • 案例开发-日程管理2第一期(超详细教程、配备图文和源代码注释,没学过也能看懂)
  • 基于腾讯云 AI 代码助手的Web端宝可梦图鉴实践记录
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Docker: 容器互访的三种方式
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • js中forEach回调同异步问题
  • Linux Process Manage
  • Netty 4.1 源代码学习:线程模型
  • node学习系列之简单文件上传
  • PHP 的 SAPI 是个什么东西
  • 好的网址,关于.net 4.0 ,vs 2010
  • 将 Measurements 和 Units 应用到物理学
  • 数据可视化之 Sankey 桑基图的实现
  • 数组大概知多少
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • k8s使用glusterfs实现动态持久化存储
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​2020 年大前端技术趋势解读
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #includecmath
  • (20)docke容器
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (笔记)M1使用hombrew安装qemu
  • (力扣)循环队列的实现与详解(C语言)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (四)软件性能测试
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core WebAPI中封装Swagger配置
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net 获取url的方法
  • .net/c# memcached 获取所有缓存键(keys)
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET的数据绑定
  • .NET建议使用的大小写命名原则
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [<MySQL优化总结>]
  • [AIGC] 深入浅出 Python中的`enumerate`函数