代码随想录第第五十七天—回文子串,最长回文子序列

leetcode 647. 回文子串

题目链接:回文子串

版本一:动态规划

  1. dp数组及下标的含义
    dp[i][j]:区间范围[i, j] (左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
  2. 确定递推公式
    (1)当s[i]与s[j]不相等时,dp[i][j] = false
    (2)当s[i]与s[j]相等时,有如下三种情况:
    情况一:下标 i 与 j相同,同一个字符,是回文子串
    情况二:下标 i 与 j相差为1,是回文子串
    情况三:下标 i 与 j相差大于1的时候,区间[i,j]是不是回文子串取决于[i+1,j-1]区间,即dp[i+1][j-1]
if (s[i] == s[j]) {if (j - i <= 1) { //情况一和情况二result++;dp[i][j] = true;} else if (dp[i + 1][j - 1]) { //情况三result++;dp[i][j] = true;}
}
  1. dp数组初始化
    dp[i][j]初始化为false
  2. 遍历顺序
    dp[i][j]的值取决于左下角dp[i+1][j-1]的值,所以遍历顺序是从下到上,从左到右
    在这里插入图片描述

根据dp[i][j]的定义,j一定是大于等于i的,在填充dp[i][j]的时候一定是只填充右上半部分。
整体代码如下:

class Solution {
public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), 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) { // 情况一 和 情况二result++;dp[i][j] = true;} else if (dp[i + 1][j - 1]) { // 情况三result++;dp[i][j] = true;}}}}return result;}
};

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

版本二:双指针法

遍历中心点的时候,中心点有两种情况:一个元素可以作为中心点,两个元素也可以作为中心点。

class Solution {
public:int countSubstrings(string s) {int result = 0;for (int i = 0; i < s.size(); i++) {result += extend(s, i, i, s.size()); // 以i为中心result += extend(s, i, i + 1, s.size()); // 以i和i+1为中心}return result;}int extend(const string& s, int i, int j, int n) {int res = 0;while (i >= 0 && j < n && s[i] == s[j]) {i--;j++;res++;}return res;}
};

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

leetcode 516. 最长回文子序列

题目链接:最长回文子序列
回文子串是要连续的,回文子序列可以不是连续的

  1. 确定dp数组及下标的含义
    dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]
  2. 确定递推公式
    如果s[i]与s[j]相同,则dp[i][j] = dp[i + 1][j - 1] + 2
    如果s[i]与s[j]不相同,s[i]和s[j]同时加 并不能增加[i,j]区间回文子序列的长度,分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。加入s[j]的回文子序列长度为dp[i + 1][j],加入s[i]的回文子序列长度为dp[i][j - 1]。则dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
if (s[i] == s[j]) {dp[i][j] = dp[i + 1][j - 1] + 2;
} else {dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
}
  1. dp数组初始化
    当i,j相同时,dp[i][j]=1,其他值取0
vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));
for (int i = 0; i < s.size(); i++) dp[i][i] = 1;
  1. 确定遍历顺序
    从下到上,从左到右
    在这里插入图片描述

整体代码如下:

class Solution {
public:int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));for (int i = 0; i < s.size(); i++) dp[i][i] = 1;for (int i = s.size() - 1; i >= 0; i--) {for (int j = i + 1; j < s.size(); j++) {if (s[i] == s[j]) {dp[i][j] = dp[i + 1][j - 1] + 2;} else {dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);}}}return dp[0][s.size() - 1];}
};

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/343192.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务基础设施怎么建设,如何选择微服务框架

微服务基础设施架构全貌 微服务 vs SOA 微服务基础设施优先级 微服务框架核心 模式1-嵌入式SDK式 【优点】 1. 架构简单&#xff0c;天然支持高性能、高可用&#xff1b; 2. 维护简单&#xff0c;无需维护独立的 Proxy 节点。 【缺点】 1. 应用侵入&#xff0c;需要集成 SD…

SQL-DML增删改

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

PXE 高效批量网络装机

前提&#xff1a; 虚拟机恢复到初始化 调整网卡为vm1 关闭防火墙 安全linux systemctl stop firewalld vim /etc/selinux/config 配置IP地址 vim /etc/sysconfig/network-scripts/ifcfg-ens33 重启网卡 systemctl restart network 挂载磁盘 安装yum源 安装服务 yum install vs…

紫光展锐T770安卓核心板_展锐T770 5G核心板规格参数

紫光展锐T770安卓核心板是一款高性能的5G安卓智能模块&#xff0c;拥有先进的6nm制程工艺和强大的性能。板载8GB Ram 256GBROM的内存单元&#xff0c;支持4K H.265/ H.264视频编解码&#xff0c;搭载Android 13以上操作系统&#xff0c;功能丰富。除了支持5G NSA和SA双模式向下…

【工具栏】RestfulTool 插件的使用(接口开发规范)

目录 1. 安装 2.使用 1. 安装 2.使用 点开控制层&#xff0c;该控制层写了什么接口一目了然 跳转对应的接口&#xff0c;查看代码

韩国LG集团在 CES2024 消费电子展上发布的的无线透明OLED屏幕

国际消费类电子产品展览会&#xff08;International Consumer Electronics Show&#xff0c;简称CES&#xff09;&#xff0c;由美国电子消费品制造商协会&#xff08;简称CTA&#xff09;主办&#xff0c;旨在促进尖端电子技术和现代生活的紧密结合。该展始于1967年&#xff…

鸿蒙开发笔记(一):ArkTS概述及声明式UI的使用

ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。 ArkTS在TS的基础上主要扩展了如下能力&#xff1a; 基本语法&#xff1a;ArkTS定义…

SSL协议握手过程

RSA握手 1.客户端向服务器发送Client Hello&#xff0c;告诉服务器我支持的协议版本&#xff0c;加密套件、客户端随机数等信息。 2.服务器收到响应&#xff0c;选择双方都支持的协议套件、服务端随机数&#xff0c;向客户端发送Server Hello。同时服务器也将自己的证书发送到…

【java八股文】之多线程篇

1、简述线程、进程的基本概念。以及他们之间关系是什么 进程&#xff1a;是程序的一次执行的过程&#xff0c;是系统运行的基本单位&#xff0c;其中包含着程序运行过程中一些内存空间和系统资源。进程在运行过程中都是相互独立&#xff0c;但是线程之间运行可以相互影响。 线程…

Nginx服务安装

Nginx(发音为[engine x]&#xff09;专为性能优化而开发&#xff0c;其最知名的优点是它的稳定性和低系统资源消 耗&#xff0c;以及对HTTP并发连接的高处理能力&#xff08;单台物理服务器可支持30000~50000个并发请求&#xff09;。正因 为如此&#xff0c;大量提供社交网络、…

视频号下载小助手:教你微信视频号怎么提取视频出来

作为一名剪辑师或自由职业者,我们作为短视频创作者有时候需要下载多个视频用于制作多个解说系列的视频或者连续剧。然而,下载这些视频通常需要花费大量时间和精力,尤其是在没有合适的工具的情况下&#xff0c;让我们制作视频也确实困难&#xff0c;那么我们该如何解决呢&#x…

科研绘图(三)百分比堆叠线条图

百分比堆叠线条图是一种数据可视化工具&#xff0c;它结合了堆叠面积图和线条图的特点。在这种图表中&#xff0c;时间序列数据被分成几个部分&#xff0c;每个部分代表一个类别&#xff0c;所有类别的值加起来总和为100%。这种图的每个点的堆叠区域代表不同类别在特定时间点的…