算法学习 | day49/60 回文子串/最长回文子串

2024-04-29 18:52

本文主要是介绍算法学习 | day49/60 回文子串/最长回文子串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目打卡

        1.1 回文子串

        题目链接:. - 力扣(LeetCode)

class Solution {
public:int countSubstrings(string s) {// vector<bool> dp;// // 这里想在初始化之外进行构造,就需要使用 assign 函数// if(s.size()&1 == 0) dp.assign(s.size()/2,false);// else dp.assign(s.size()/2+1,false);// if(s.size()&1 == 1) dp[0] = true;// else{//     if(s[s.size()/2 - 1] == s[s.size()]) dp[0] = true;// }// for(int i = 1, j = s.size()&1 ? :s.size()/2+1)// return 1;// 在[i,j]之间的子串是不是回文串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 i = 0; i < s.size();i++){for(int j = i; j < s.size();j++){if(s[i] == s[j]){if(j - i <= 1){dp[i][j] = true;res++;}else{if(dp[i+1][j - 1]){dp[i][j] = true;res++;}}}}}for(int i = 0 ; i < s.size();i++){for(int j = 0; j < s.size();j++){cout << dp[i][j] << " "; }cout << endl;}return res;}};

        这里和之前动态规划类题目都不太一样,这个题目的dp数字的定义主要是考虑了回文这个结构的特殊性,直接看的答案解析,看懂了其实再来理解这个题目就不是很难了。

        动态规划转移的方程,重要的是要理解为什么这个转移的方向来自左下角,这也决定了后面的遍历顺序,必须是从i的最后面向前遍历,否则就会是没有填充的数值进行的递推。

        1.2 最长的回文子串

        题目链接:. - 力扣(LeetCode)

class Solution {
public:int longestPalindromeSubseq(string s) {// [i,j]之间最长的回文子序列vector<vector<int>> dp(s.size(),vector<int>(s.size(), 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) dp[i][j] = 1;else if(j - i == 1) dp[i][j] = 2;else dp[i][j] = dp[i + 1][j - 1] + 2;}else dp[i][j] = max({dp[i + 1][j - 1], dp[i][j-1], dp[i+1][j]});}}// for(int i = 0; i < s.size();i++){//     for(int j = 0 ; j< s.size();j++){//         cout << dp[i][j] << " ";//     }//     cout << endl;// }return dp[0][s.size() - 1];}
};

        和上面的题目稍微有一点区别,但是转移的思路其实还是一致的,主要在于处理递推的时候,需要注意当前两个指针不相等的时候,递推的方法就需要对之前的内容进行处理。

这篇关于算法学习 | day49/60 回文子串/最长回文子串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Blender学习入门:让图片动起来

Blender简介 Blender 是一款开源的三维计算机图形软件,它提供了广泛的功能,包括建模、动画、渲染、视频编辑等。Blender还支持Python编程接口,允许用户通过编写脚本来控制和定制软件的各个方面。 Blender的功能非常强大,它被广泛应用于电影制作、动画制作、游戏开发等领域。由于其开源的特性,Blender还拥有一个活跃的社区,用户可以分享插件、教程和艺术作品。 Blen

##24 多模态深度学习基础:框架、应用与展望

文章目录 前言1. 多模态学习的概念与重要性2. 关键技术框架2.1 数据表示与特征提取2.2 模态融合策略2.3 多任务学习 3. 应用实例3.1 医疗图像分析3.2 自动驾驶汽车3.3 情感分析 4. 挑战与未来展望结语 前言 在深度学习的世界中,多模态学习是一个令人兴奋的前沿领域,它旨在整合来自不同数据源的信息,例如文本、图像和音频,以创造出能更全面理解和处理复杂数

lintcode 求最长公共子串

给出两个字符串,找到最长公共子串,并返回其长度。 这个其实比较简单,因为只要返回最长公共子串的长度就可以了,不用找出他们。PS:如果要是要求返回最长公共子串呢? 动态规划,最优子结构if s[i] == t[j], L[i,j] = L[i-1,j-1]+1 if s[i]!=t[j] L[i,j] = 0, 这里是区别于最长公共子序列的,因为L[i,j] 代表以i结尾的s[i]和以j结尾的

【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置

本节博客主要是通过“在排序数组中查找元素的第一个和最后一个位置”总结关于二分算法的左右界代码模板,有需要借鉴即可。 目录 1.题目2.二分边界算法2.1查找区间左端点2.1.1循环条件2.1.2求中点的操作2.1.3总结 2.2查找区间右端点2.1.1循环条件2.1.2求中点的操作2.1.3总结 2.3总结 3.参考解题代码4.模板总结5.总结 1.题目 题目链接:LIN

【算法刷题day55】Leetcode:583. 两个字符串的删除操作、72. 编辑距离

文章目录 Leetcode 583. 两个字符串的删除操作解题思路代码总结 Leetcode 72. 编辑距离解题思路代码总结 草稿图网站 java的Deque Leetcode 583. 两个字符串的删除操作 题目:583. 两个字符串的删除操作 解析:代码随想录解析 解题思路 dp数组的含义是,从word1从0到i-1,word2从0到j-1匹配上最少需要删除

【Unity学习笔记】第十六 World space、Parent space和Self space及Quaternion左乘右乘辨析

目录 World space、Parent space和Self space不同坐标系下的移动不同坐标系下的旋转——Quaternion左乘右乘的区别辨析总结 参考: Unity 世界坐标&局部坐标下的旋转Quaternion multiplication orderlocal space vs global space vs object space in unity3dTr

算法概论8章,部分习题证明

8.3 STINGY SAT问题定为NP-complete 证明:首先,这个问题能在多项式时间内验证一个指派是否是解。另外SAT问题是它的特例,所以是NP-complete的。 8.8 EXACT 4SAT问题为 NP-complete 证明:首先,这个问题能在多项式时间内验证一个指派是否是解。我们只需证明3SAT问题能规约到它即可。对于一个逻辑表达式 x x,它等价于(x∨w)∧(x∨w¯

【董晓算法】竞赛常用知识点之数据结构1

前言: 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com)  动态规划系列(还没学完) 【董晓算法】动态规划之线性DP问题-CSDN博客 【董晓算法】动态规划之背包DP问题(2024.5.11)-CSDN博客 【董晓算法】动态规划之背包DP与树形DP-CSDN博客 字符串系列 【董晓算法】竞赛常用知识之字符

web安全学习笔记(16)

记一下第27-28课的内容。Token 验证 + URL跳转漏洞的类型与三种跳转形式;URL跳转漏洞修复 + 短信轰炸漏洞绕过挖掘 一、token有关知识 什么是token?token是用来干嘛的?_token是什么意思-CSDN博客 二、URL跳转漏洞 我们在靶场中,如果没有登录就想进行购买操作,会弹出提示让我们先登录: 我们点击“去登陆”,然后看上面的URL,会有一个redire