算法Day57 | 647. 回文子串,516.最长回文子序列,动态规划总结

news/2024/12/2 23:56:15/

Day57

    • 647. 回文子串
    • 516.最长回文子序列
    • 动态规划总结

647. 回文子串

题目链接:647. 回文子串
dp数组:为了便于找到回文关系,因此定义二维dp数组,有 :
dp[i][j]表示[i, j]范围内(左闭右闭区间)是否为回文子串

递推公式

if (s[i] == s[j] && (j - i <= 1 || dp[i + 1][j - 1])) {++res;dp[i][j] = true;
}

s[i] == s[j]的前提下,[i, j]范围内

  • j - i = 0表示i j为同一个字母,一定为回文串
  • j - i = 1表示回文串为两个字母
  • dp[i + 1][j - 1]表示为两个字母以上时,[i + 1, j - 1]范围内为回文串(dp[i + 1][j - 1] == true),[i, j]一定为回文串

初始化
都初始化为false

遍历顺序
根据递推公式dp[i][j]是根据dp[i + 1][j - 1]来获得的,因此需要i从后往前遍历,j从前往后遍历。注意:要始终保持j >= i

class Solution {
public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int res = 0;for (int i = s.size() - 1; i >= 0; --i) {for (int j = i/*保证j >= i*/; j < s.size(); ++j) {if (s[i] == s[j] && (j - i <= 1 || dp[i + 1][j - 1])) {++res;dp[i][j] = true;//用来推断dp[i - 1][j + 1]是否为回文的}}}return res;}
};

双指针也可以

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

516.最长回文子序列

题目链接:516.最长回文子序列
dp数组:为了便于找到回文关系,因此定义二维dp数组,有 :
dp[i][j]表示[i, j]范围内(左闭右闭区间)回文子序列的长度

递推公式

dp[i][j] = (s[i] == s[j])? dp[i + 1][j - 1] + 2;: max(dp[i + 1][j], dp[i][j - 1]);

dp[i + 1][j - 1] + 2;

  • s[i] == s[j],因此要加上 +2 表示加上ij的长度

max(dp[i + 1][j], dp[i][j - 1]);

  • s[i] != s[j],因此要比较dp[i + 1][j], dp[i][j - 1]最长的

初始化
由递推公式可知,初始值为dp[k][k] = 1(表示ij相等,为二维dp数组的对角线)

遍历顺序
根据递推公式dp[i][j]是根据dp[i + 1][j - 1], dp[i + 1][j], dp[i][j - 1]来获得的,因此需要i从后往前遍历,j从前往后遍历。注意:要始终保持j > i,为什么j == i去掉了,因为j == i已经被初始化了。

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) {dp[i][j] = (s[i] == s[j])? dp[i + 1][j - 1] + 2: max(dp[i][j - 1], dp[i + 1][j]);}}return dp[0].back();}
};

动态规划总结

下次总结


http://www.ppmy.cn/news/730803.html

相关文章

c语言方框透视原理,FPS游戏的方框透视+自瞄原理

目录 一,自瞄 准备工作: 计算工作: 准备工作: 计算工作: 一,自瞄 基于所有的FPS游戏,都有一个人物结构,包含人物在地图上的三维坐标,人物的准心数据。 而实现内存自瞄就是通过查找自己和敌人之前的三维坐标数据,将三维坐标数据转换为二维的准心数据。 准备工作: 1.查…

python_性能FPS

PS 全称&#xff1a;每秒传输帧数(Frames Per Second) 详细见百科&#xff1a;https://baike.baidu.com/item/FPS/3227416?fraladdin 内容提取&#xff1a; 1.图形领域。画面每秒的传输帧数&#xff0c;动画或视频的画面数 2.游戏领域。通常叫做“刷新率”&#xff08;单位Hz赫…

神经网络学习小记录72——Parameters参数量、FLOPs浮点运算次数、FPS每秒传输帧数等计算量衡量指标解析

神经网络学习小记录72——Parameters参数量、FLOPs浮点运算次数、FPS每秒传输帧数等计算量衡量指标解析 学习前言网络的运算时组成我们要关注网络的什么指标1、Parameters参数量2、FLOPs 浮点运算次数3、Latency 延迟4、FPS 每秒传输帧数 指标间的关系网络的运算速度与什么有关…

目标检测常用的性能指标:mAP、IoU、FPS、NMS、top1,top5

mAP 这里首先介绍几个常见的模型评价术语&#xff0c;现在假设我们的分类目标只有两类&#xff0c;计为正例&#xff08;positive&#xff09;和负例&#xff08;negtive&#xff09;分别是&#xff1a; 1&#xff09;True positives(TP): 被正确地划分为正例的个数&#xff…

FrameTime、FPS、流畅度、Jank

GitHub - smart-test-ti/SoloX: SoloX - Real-time collection tool for Android performance data.&#xff08;移动端性能测试\APP性能测试\Android性能测试&#xff09;SoloX - Real-time collection tool for Android performance data.&#xff08;移动端性能测试\APP性能…

人脸对齐 3000fps

1 介绍 3000fps 相关概念主要是在实现jda方法的时候仔细了解过&#xff0c;基本原理总体说来很复杂&#xff0c;但是从实现的角度来看并不难。该方法的速度还是不错的&#xff0c;能够达到论文中提到的数据&#xff0c;效果嘛就有点差强人意了&#xff0c;主要还是由样本决定。…

mmdetection计算fps和参数量

首先记住一句话&#xff1a;模型的参数量越小&#xff0c;这个模型的计算量不一定小&#xff0c;速度也不一定快&#xff0c;这句话是真对啊 python tools/analysis_tools/get_flops.py work_dirs/faster_rcnn_r50_fpn_1x_voc0712/faster_rcnn_r50_fpn_1x_voc0712.pypython to…

【Hello mysql】 数据库基础

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;简单的介绍mysql相关的一些基础知识和在Linux环境下的安装 让大家对于mysql有一个初步的认知 数据库基础 数据库基础数据库定义数据库再理解软件角度文件角度总结 主流数据库mysql安装卸载不要的环境获取mysql官方yum源安装…