【代码随想录】【算法训练营】【第52天】 [647]回文子串 [516]最长回文子序列

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。

day 52,周五,开始补作业了~

题目详情

[647] 回文子串

题目描述

647 回文子串
647 回文子串

解题思路

前提:寻找回文子串,子串意味着元素连续
思路:动态规划 寻找dp数组之间有联系的推导关系, dp[i][j]: 字符串中[i, j]子串是否为回文子串,s[i] == s[j]时, 3种情况, ij时,true, i+1j时,true, j>i+1时,dp[i][j] = dp[i+1][j-1], s[i] != s[j]时, dp[i][j] = false,统计dp数组中true的数量
重点:dp数组的定义、递推公式的推导、回文子串的条件判断

代码实现

C语言
动态规划
// 动态规划 dp[i][j]: 字符串中[i, j]子串是否为回文子串
// s[i] == s[j]时, 3种情况, i==j时,true, i+1==j时,true, j>i+1时,dp[i][j] = dp[i+1][j-1]
// s[i] != s[j]时, dp[i][j] = false
// 统计dp数组中true的数量

int countSubstrings(char* s) {
    int sLen = strlen(s);
    bool dp[sLen][sLen];
    int count = 0;
    // 遍历
    for (int i = sLen - 1; i >= 0; i--) {
        for (int j = i; j < sLen; j++) {
            if (j == i) {
                dp[i][j] = true;
            } else if (j == i + 1) {
                if (s[i] == s[j]) {
                    dp[i][j] = true;
                } else {
                    dp[i][j] = false;
                }
            } else {
                if (s[i] == s[j]) {
                    dp[i][j] = dp[i + 1][j - 1];
                } else {
                    dp[i][j] = false;
                }
            }
            if (dp[i][j] == true) {
                count++;
            }
        }
    }
    return count;
}
双指针
// 双指针: 2种情况
// 以单个元素为核心向两边扩展,寻找回文子串的个数
// 以两个元素为核心向两边扩展,寻找回文子串的个数

int checkSubStrings(char *s, int sLen, int i, int j)
{
    int res = 0; 
    while (i >= 0 && j < sLen && s[i] == s[j]) {
        res++;
        i--;
        j++;
    }
    return res;
}

int countSubstrings(char* s) {
    int sLen = strlen(s);
    int count = 0;
    for (int i = 0; i < sLen; i++) {
        // 单元素为核心
        count += checkSubStrings(s, sLen, i, i);
        // 双元素为核心
        count += checkSubStrings(s, sLen, i, i + 1);
    }
    return count;
}

[516] 最长回文子序列

题目描述

516 最长回文子序列
516 最长回文子序列

解题思路

前提:寻找最长回文子序列,子序列意味着元素可以不连续,元素相对顺序一致即可
思路:动态规划 dp[i][j]: 字符串在[i, j]中最长回文子序列的长度,分为两种情况,s[i] == s[j]时, dp[i][j] = dp[i+1][j-1] + 2;s[i] != s[j]时, 分别尝试将s[i]/s[j]加入,判断是否为回文子序列,取最大值, dp[i][j] = max(dp[i][j-1], dp[i+1][j])
重点:dp数组的定义、递推公式的推导、回文子串的条件判断

代码实现

C语言
动态规划
// 动态规划 dp[i][j]: 字符串在[i, j]中最长回文子序列的长度
// 分为两种情况
// s[i] == s[j]时, dp[i][j] = dp[i+1][j-1] + 2;
// s[i] != s[j]时, 分别尝试将s[i]/s[j]加入,判断是否为回文子序列,取最大值, dp[i][j] = max(dp[i][j-1], dp[i+1][j])

int maxFun(int p1, int p2)
{
    return p1 > p2 ? p1 : p2;
}

int longestPalindromeSubseq(char* s) {
    int sLen = strlen(s);
    int dp[sLen][sLen];
    // dp初始化
    for (int i = 0; i < sLen; i++) {
        for (int j = 0; j < sLen; j++) {
            dp[i][j] = 0;
        }
        dp[i][i] = 1;
    }
    // 遍历
    for (int i = sLen - 1; i >= 0; i--) {
        for (int j = i + 1; j < sLen; j++) {
            if (s[i] == s[j]) {
                dp[i][j] = dp[i + 1][j - 1] + 2;
            } else {
                dp[i][j] = maxFun(dp[i + 1][j], dp[i][j - 1]);
            }
        }
    }
    return dp[0][sLen - 1];
}

今日收获

  1. 动态规划

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python-Tkinter+Logging+Sqlserver项目结合

参考文章&#xff1a; https://www.jb51.net/article/283745.htm 目录&#xff1a; common(文件夹) – base.py – config_reader.py – dosqlserver.py – log.py txt&#xff08;空文件夹&#xff0c;后面会自动生成txt文件在该文件夹下面&#xff09; 1.txt 2.txt env.…

非平稳信号的时频表示-基于本征模态函数(MATLAB)

时频分析思想萌芽于匈牙利物理学家 Gabor 在 1946 年所提出的 Gabor 展开理论&#xff0c;随后以此为基础发展出著名的线性时频变换方法—短时傅里叶变换。短时傅里叶变换假设分析信号在有限时长内具有平稳特性&#xff0c;它首先将时间与频率均为有限支撑的窗函数与分析信号进…

973. 最接近原点的 K 个点-k数组维护+二分查找

973. 最接近原点的 K 个点-k数组维护二分查找 给定一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点&#xff0c;并且是一个整数 k &#xff0c;返回离原点 (0,0) 最近的 k 个点。 这里&#xff0c;平面上两点之间的距离是 欧几里德距离&#…

Linux修炼之路之进程概念,fork函数,进程状态

目录 一&#xff1a;进程概念 二&#xff1a;Linux中的进程概念 三&#xff1a;用getpid(),getppid()获取该进程的PID,PPID 四&#xff1a;用fork()来创建子进程 五&#xff1a;操作系统学科的进程状态 六&#xff1a;Linux中的进程状态 接下来的日子会顺顺利利&#xf…

【MySQL备份】Percona XtraBackup加密备份实战篇

目录 1.前言 2.准备工作 2.1.环境信息 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 2.4.生成加密密钥 2.5.配置加密密钥文件 3.加密备份 4.优化加密过程 5.解密加密备份 6.准备加密备份 7.恢复加密备份 7.1.使用rsync进行恢复 7.2.使用xtrabackup命令恢…

crewAI实践过程中,memory规避openai的使用方法以及(windows下xinferece框架使用踩过的坑)

问题&#xff1a; 在使用crewAI开发项目的过程中&#xff0c;memory开启后报错&#xff1a;openai key is fake 经代码核查&#xff0c;其默认使用了openai的embedding模型。 解决方法 经查阅资料&#xff0c;可以参考其本地部署llm的方法。 本地部署模型可以使用xinference…

人工智能导论速成笔记

文章目录 前言考试题型第一章、人工智能导引 (10分 )课后习题第二章、Python基础 (10分 )*文件读写NumPy的使用Python绘图基础第三章、机器学习初步(15分 )逻辑回归分类(Logistic Regression)*,3.5线性回归预测(Linear Regression)*,3.6 、3.7、 3.8聚类 3.9第四章、自然语言…

【信息系统项目管理师】常见图表

作文里面的画图题用语言描述画图过程 合同 采购综合评分标准 责任分配矩阵 成本预算表 成本估算 成本管理计划 活动清单 活动属性 变更日志 问题日志 项目章程 自己再添加更多内容 甘特图 甘特图包含以下三个含义&#xff1a; 1、以图形或表格的形式显示活动&#xff1b; 2、…

uniapp封装虚拟列表滚动组件

uniapp封装虚拟列表滚动组件 这里用到一个列表&#xff0c;然后数据可能有很多很多…&#xff0c;一次性全部渲染到dom上会卡顿&#xff0c;很废性能&#xff0c;于是用了这个虚拟列表就变丝滑很多很多。 组件mosoweInventedList 代码&#xff1a; <!-- 虚拟滚动列表组件&a…

常见VPS主机术语有哪些?VPS术语解析

常见VPS主机术语有哪些&#xff1f;本期为大家解析一下我们常见到的听到的VPS专业术语&#xff0c;帮助大家更轻松的了解VPS主机相关知识。 常见VPS主机术语 Apache – 世界上最流行的 Web 服务器软件。 CentOS – 旨在提供基于 Red Hat Enterprise Linux 的企业级操作系统的…

常微分方程算法之编程示例七-两点混合边值问题(打靶法)

目录 一、研究问题 二、C++代码 三、计算结果 一、研究问题 本节我们采用打靶法求解两点混合边值问题,打靶法的原理及推导思路请参考: 常微分方程算法之“两点边值问题”求解-CSDN博客https://blog.csdn.net/L_peanut/article/details/137449287 研究问题为

学习笔记(linux高级编程)9

void pthread_cleanup_push(void (*routine)(void *)&#xff0c; void *arg); 功能&#xff1a;注册一个线程清理函数 参数&#xff0c;routine&#xff0c;线程清理函数的入口 arg&#xff0c;清理函数的参数。 返回值&#xff0c;无 void pthread_cleanup_pop(int execute)…

Node.js学习(一)

Node.js安装与入门案例&#xff1a; 需求&#xff1a;点击按钮&#xff0c;请求本地目录指定文件的内容&#xff0c;并显示在页面上 刚入门肯定想着直接写相对路径请求指定路径数据就行了&#xff0c;可是会发现不行。 网页运行在浏览器端&#xff0c;通常后续要发布&#xf…

大模型应用开发实战基础

大模型应用开发实战基础 1. 背景 大模型如日中天&#xff0c;各行各业都受它影响&#xff0c;但是作为程序员&#xff0c;除了让它翻译代码不知道用它干什么&#xff0c;就像是拿着锤子的木匠&#xff0c;找不到钉子在哪。一边听着别人说2024是AI元年&#xff0c;一边又不知所…

数组-二分查找

二分查找 leetcode704 /*** param {number[]} nums* param {number} target* return {number}*/ var search function(nums, target) {let left 0, right nums.length - 1;while (left < right) {const mid Math.floor((right - left) / 2) left;const num nums[mid]…

【antd + vue】表格行合并,同时使用插槽

一、需求说明 表格中&#xff0c;如果一个学校有多个考试科目&#xff0c;则分行展示&#xff0c;其余列&#xff0c;则合并为一行展示&#xff0c;如图所示 二、需求分析 1、表格行合并 相当于有4行&#xff0c;其中1、2行是同一个学校包含不同考试科目及对应人次的数据&am…

生成式AI赋能金融信贷:减少信用评分偏差

信用评分在确定谁获得信贷以及以何种条件获得信贷方面发挥着关键作用。然而&#xff0c;尽管这一点很重要&#xff0c;但传统的信用评分系统长期以来一直受到一系列关键问题的困扰——从偏见和歧视&#xff0c;到有限的数据考虑和可扩展性挑战。例如&#xff0c;一项针对美国贷…

1:25万基础电子地图(西藏版)

我们为你分享过四川版、云南版、江西版、贵州版、重庆版和青海版的1比25万基础电子地图&#xff0c;现在再为你分享西藏版的电子地图。 如果你需要西藏版的1比25万基础电子地图&#xff0c;你可以在文末查看该数据的领取方法。 基础电子地图西藏版 西藏版1:25万基础电子地图…

Xilinx FPGA:vivado利用单端RAM/串口传输数据实现自定义私有协议

一、项目要求 实现自定义私有协议&#xff0c;如&#xff1a;pc端产生数据&#xff1a;02 56 38 &#xff0c;“02”代表要发送数据的个数&#xff0c;“56”“38”需要写进RAM中。当按键信号到来时&#xff0c;将“56”“38”读出返回给PC端。 二、信号流向图 三、状态…

FVCOM水环境、污染物迁移、水交换、水质、潮流、温盐、波浪及泥沙数值模拟

原文链接&#xff1a;FVCOM水环境、污染物迁移、水交换、水质、潮流、温盐、波浪及泥沙数值模拟https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247607618&idx2&sn5132fb8bfcbd02c2be308f6c6304c6d2&chksmfa8264a5cdf5edb3226d1b0597bb6c39f867601b961b…