首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用带缓存的递归求解最长回文子序列的大O分析

最长回文子序列是指在一个字符串中,找到一个最长的子序列,使得该子序列从左到右和从右到左读取是一样的。例如,在字符串"abcbda"中,最长回文子序列是"abcba",长度为5。

带缓存的递归是一种优化技术,用于减少重复计算。在求解最长回文子序列时,可以使用带缓存的递归算法来提高效率。

大O分析是一种衡量算法时间复杂度的方法,用于评估算法的运行时间随输入规模增长的趋势。在求解最长回文子序列的问题中,使用带缓存的递归算法的时间复杂度为O(n^2),其中n是字符串的长度。

具体的算法步骤如下:

  1. 定义一个二维数组dp,其中dp[i][j]表示字符串从第i个字符到第j个字符的最长回文子序列的长度。
  2. 初始化dp数组的对角线元素为1,即dp[i][i]=1,表示单个字符本身就是一个回文子序列。
  3. 从字符串的最后一个字符开始,逐个向前遍历字符串。
  4. 对于每个字符,从当前字符的下一个字符开始,逐个向后遍历字符串。
  5. 如果当前字符和遍历到的字符相等,则dp[i][j] = dp[i+1][j-1] + 2,表示当前字符和遍历到的字符可以构成一个更长的回文子序列。
  6. 如果当前字符和遍历到的字符不相等,则dp[i][j] = max(dp[i+1][j], dp[i][j-1]),表示当前字符和遍历到的字符无法构成回文子序列,需要从前一个字符或后一个字符中选择较长的回文子序列。
  7. 遍历完所有字符后,dp[0][n-1]即为最长回文子序列的长度,其中n为字符串的长度。

带缓存的递归算法通过缓存已经计算过的结果,避免重复计算,从而提高了算法的效率。在求解最长回文子序列时,可以使用一个二维数组cache来缓存已经计算过的dp值。每次计算dp[i][j]时,先检查cache[i][j]是否已经计算过,如果已经计算过,则直接返回缓存的结果,否则按照上述步骤计算dp[i][j]并将结果存入cache中。

带缓存的递归算法的时间复杂度为O(n^2),空间复杂度为O(n^2),其中n是字符串的长度。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库MySQL版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云CDN加速:https://cloud.tencent.com/product/cdn
  • 腾讯云云安全中心:https://cloud.tencent.com/product/ssc
  • 腾讯云音视频处理(MPS):https://cloud.tencent.com/product/mps
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发平台(MTP):https://cloud.tencent.com/product/mtp
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Tencent XR):https://cloud.tencent.com/product/xr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

『ACM-算法-动态规划』初识DP动态规划算法

二、能采用动态规划求解问题一般要具有3个性质: 最优化原理:如果问题最优解所包含问题解也是最优,就称该问题具有最优结构,即满足最优化原理。...上一章递归做法,这次我们采用递推做法。 递归:从已知问题结果出发,迭代表达式逐步推算出问题开始条件,即顺推法逆过程,称为递归。...,上文讲到最长单调子序列就是经典线性模型,这里线性指的是状态排布是性。...这样做时间复杂度降为O(Vsum(logMi) )。找不到出处了 给定一个字符串s,你可以从中删除一些字符,使得剩下串是一个回文串。如何删除才能使得回文最长呢? 输出需要删除字符个数。...本题可转化为动态规划算法求解最长公共序列问题,然后用总字符串长度减去最长序列长度,便得出问题答案。 先将给定初始字符串S1反过来排列,设为S2,求S1和S2最长公共序列便可。

57420

字节跳动一道动态规划面试题

正好我们昨天在聊动态规划爬楼梯问题,今天我们也就来聊聊字节面试题中最长回文序列问题。 题目是这样:给定一个序列,找到其中最长回文序列,并返回该序列长度。...示例 1: 输入: "abdbca" 输出: 5 一个可能最长回文序列为 "abdba"。 示例 2: 输入: "cddpd" 输出: 3 一个可能最长回文序列为 "ddd"。...时间复杂度达到了O(2^n),n是输入序列长度,这里空间复杂度是O(n)。 没关系,我们再来用我们擅长缓存来优化。 自上而下 我们来用一个数组去保存已经解决过问题。...我们现在用一个二维数组缓存问题结果,dp[st.length()][st.length()],也就是说,我们不会有超过n*n问题,n是输入序列长度,这意味着我们时间复杂度是O(n^2)。...而我们空间复杂度也因为数组开销变成了O(n^2),没关系,空间换时间嘛,很正常。 自下而上 我们是想尝试给定序列所有序列,我们还是二维数组来存储我们结果。

96710

看一遍就理解:动态规划详解

所以呢,用了备忘录递归算法,递归树变成光秃秃树干咯,如下: ? 备忘录递归算法,问题个数=树节点数=n,解决一个问题还是O(1),所以备忘录递归算法时间复杂度是O(n)。...接下来呢,我们备忘录递归算法去撸代码,解决这个青蛙跳阶问题超时问题咯~,代码如下: public class Solution { //使用哈希map,充当备忘录作用 Map<...其实,还可以动态规划解决这道题。 自底向上动态规划 动态规划跟备忘录递归解法基本思想是一致,都是减少重复计算,时间复杂度也都是差不多。...但是呢: 备忘录递归,是从f(10)往f(1)方向延伸求解,所以也称为自顶向下解法。...备忘录递归解法,空间复杂度是O(n),但是呢,仔细观察上图,可以发现,f(n)只依赖前面两个数,所以只需要两个变量a和b来存储,就可以满足需求了,因此空间复杂度是O(1)就可以啦 ?

55930

看一遍就理解:动态规划详解

所以呢,用了备忘录递归算法,递归树变成光秃秃树干咯,如下: ? 备忘录递归算法,问题个数=树节点数=n,解决一个问题还是O(1),所以备忘录递归算法时间复杂度是O(n)。...接下来呢,我们备忘录递归算法去撸代码,解决这个青蛙跳阶问题超时问题咯~,代码如下: public class Solution { //使用哈希map,充当备忘录作用 Map<Integer...其实,还可以动态规划解决这道题。 自底向上动态规划 动态规划跟备忘录递归解法基本思想是一致,都是减少重复计算,时间复杂度也都是差不多。...但是呢: 备忘录递归,是从f(10)往f(1)方向延伸求解,所以也称为自顶向下解法。...备忘录递归解法,空间复杂度是O(n),但是呢,仔细观察上图,可以发现,f(n)只依赖前面两个数,所以只需要两个变量a和b来存储,就可以满足需求了,因此空间复杂度是O(1)就可以啦 ?

31.6K5140

看一遍就理解:动态规划详解

我们先来看看这个递归时间复杂度吧: 递归时间复杂度 = 解决一个问题时间*问题个数 一个问题时间 =  f(n-1)+f(n-2),也就是一个加法操作,所以复杂度是 O(1); 问题个数 =...所以呢,用了备忘录递归算法,递归树变成光秃秃树干咯,如下: 备忘录递归算法,问题个数=树节点数=n,解决一个问题还是O(1),所以备忘录递归算法时间复杂度是O(n)。...接下来呢,我们备忘录递归算法去撸代码,解决这个青蛙跳阶问题超时问题咯~,代码如下: public class Solution {     //使用哈希map,充当备忘录作用     Map<...但是呢: 备忘录递归,是从f(10)往f(1)方向延伸求解,所以也称为自顶向下解法。...哈哈,想到这,我们就可以dp[i]表示以num[i]这个数结尾最长递增子序列长度啦,然后再来看看其中规律: 其实,nums[i]结尾自增子序列,只要找到比nums[i]小序列,加上nums

3.8K80

动态规划(dynamic programming)

状态转移方程定义和我们是如何定义子问题有关 比如:求最长连续回文串:   给出一个字符串S,求最长连续回文串,例如串 babcbabcbaccba 最长回文是:abcbabcba 我们如果定义...p( i ) :以i结尾最长回文串  我们会发现我们问题无法表示出p(i+1) 我们重新考虑一下原问题  最长连续回文串  如果另一种方式来重新定义这个问题 已知字符串 S[0,n]   求回文传...动态规划与贪心等其他算法比较 动态规划与分治,减治 分治       :将大问题分成若干个小问题去解决 递归求解每个小问题,每个小问题之间没有关系  例如 快排 减治       :将大问题缩减成小问题...而贪心算法任务无需求解所有问题,所以选择在当前情况下最优情况自顶向下求解问题,贪心可以认为是动态规划一个特例 如果一个树来表示问题的话 可以认为动态规划考虑了树中所有节点 而贪心算法减去了树了许多枝干...,在考虑了通向最优解那一条路 常见可以动态规划解决问题 1、最大连续序列和:  给定k个整数序列{N1,N2,...

1.4K50

盘点互联网公司最常见面试编程题

常用一些算法思想或类别: 1) 动态规划,常考,重要是找到初始条件,状态迭代方程,比如机器人不同行走路线个数等;还有背包问题、最长序列等等,题目相当灵活; 2) 字符串:判断是否为回文字符串,串...,共有串等; 3) 数字考察,比如求sqrt(2),判断数字是否为幸福数等; 4) 二分查找:sqrt(2)求法,使用它前提一般是要求数组有序; 5) 深度优先搜索:一般可结合回溯求解很多有意思问题...两个数组交集II 334. 递增三元字序列 240. 搜索二维矩阵II 238. 除自身以外数组乘积 链表 138.复制随机指针链表 141. 环形链表 148. 排序链表 160....计算右侧小于当前元素个数 滑动窗口 395. 至少有K个重复字符最长子串 动态规划 124. 二叉树中最大路径和 128. 最长连续序列 198. 打家劫舍 279. 完全平方数 300....最长上升序列 322. 零钱兑换 329. 矩阵中最长递增路径 图论 127. 单词接龙 200. 岛屿个数 207. 课程表 210. 课程表II 字符串 125. 验证回文串 131.

2.6K20

盘点互联网公司最常见面试编程题

常用一些算法思想或类别: 1) 动态规划,常考,重要是找到初始条件,状态迭代方程,比如机器人不同行走路线个数等;还有背包问题、最长序列等等,题目相当灵活; 2) 字符串:判断是否为回文字符串,串...,共有串等; 3) 数字考察,比如求sqrt(2),判断数字是否为幸福数等; 4) 二分查找:sqrt(2)求法,使用它前提一般是要求数组有序; 5) 深度优先搜索:一般可结合回溯求解很多有意思问题...两个数组交集II 334. 递增三元字序列 240. 搜索二维矩阵II 238. 除自身以外数组乘积 链表 138.复制随机指针链表 141. 环形链表 148. 排序链表 160....计算右侧小于当前元素个数 滑动窗口 395. 至少有K个重复字符最长子串 动态规划 124. 二叉树中最大路径和 128. 最长连续序列 198. 打家劫舍 279. 完全平方数 300....最长上升序列 322. 零钱兑换 329. 矩阵中最长递增路径 图论 127. 单词接龙 200. 岛屿个数 207. 课程表 210. 课程表II 字符串 125. 验证回文串 131.

97920

盘点互联网公司最常见面试编程题

常用一些算法思想或类别: 1) 动态规划,常考,重要是找到初始条件,状态迭代方程,比如机器人不同行走路线个数等;还有背包问题、最长序列等等,题目相当灵活; 2) 字符串:判断是否为回文字符串,串...,共有串等; 3) 数字考察,比如求sqrt(2),判断数字是否为幸福数等; 4) 二分查找:sqrt(2)求法,使用它前提一般是要求数组有序; 5) 深度优先搜索:一般可结合回溯求解很多有意思问题...两个数组交集II 334. 递增三元字序列 240. 搜索二维矩阵II 238. 除自身以外数组乘积 链表 138.复制随机指针链表 141. 环形链表 148. 排序链表 160....计算右侧小于当前元素个数 滑动窗口 395. 至少有K个重复字符最长子串 动态规划 124. 二叉树中最大路径和 128. 最长连续序列 198. 打家劫舍 279. 完全平方数 300....最长上升序列 322. 零钱兑换 329. 矩阵中最长递增路径 图论 127. 单词接龙 200. 岛屿个数 207. 课程表 210. 课程表II 字符串 125. 验证回文串 131.

85620

动态规划之最长回文

大家好,又见面了,我是你们朋友全栈君。 问题: 给出一个字符串S,求S最长回文长度。...样例 字符串"PATZJUJZTACCBCC"最长回文串为"ATZJUJZTA",长度为9。 还是先看暴力解法:枚举子串两个端点i和j,判断在[i, j]区间内串是否回文。...从复杂度上来看,枚举端点需要0(n2),判断回文需要0(n),因此总复杂度是O(n3)。终于碰到一个暴力复杂度不是指数级别的问题了!但是O(n)复杂度在n很大情况依旧不够看。...可能会有读者想把这个问题转换为最长公共序列(LCS) 问题来求解:把字符串S倒过来变成字符串T,然后对S和T进行LCS模型求解,得到结果就是需要答案。...例如字符串S= “ABCDZJUDCBA”,将其倒过来之后会变成T = “ABCDUJZDCBA”,这样得到最长公共串为”ABCD”,长度为4,而事实上S最长回文串长度为1。

41950

浅谈我对动态规划一点理解---大家准备好小板凳,我要开始吹牛皮了~~~

因此,求解LCS问题则变成递归求解两个子问题。但是,上述递归求解办法中,重复问题多,效率低下。改进办法——空间换时间,数组保存中间状态,方便后面的计算。...举个例子,给出一序列,求出该序列最长上升序列最大长度。 我们可以这么考虑,数组a[]存储序列,b[i]表示以a[i]为结尾序列最大长度。...举个例子,我们要在一个字符串中要到最长回文串。 暴力求解: 最容易想到就是暴力破解,求出每一个串,之后判断是不是回文,找到最长那个。...这样最长回文串就能分解成一系列子问题了。这样需要额外空间O(N^2),算法复杂度也是O(N^2)。 首先定义状态方程和转移方程: P[i,j]=0表示串[i,j]不是回文串。...分析蓝色部分 ? 如果存在最长公共前后缀的话,比如这样: ? 就可以在下次匹配时候,这样避免了i回溯 ?

4.3K81

(粗糙笔记)动态规划

O(2^n) 动态规划 从蛮力枚举到备忘递归 优化子问题解,避免重复计算 构造备忘录P[i,c],P[i,c]表示在前i个商品中选择,背包容量为c时最优解 输入:商品集合{h,......n\cdot C) 上面带备忘递归和递推求解方法都属于动态规划: 备忘递归:自顶向下 递推求解:自底向上 最优结构性质: 问题最优解由相关子问题最优解组合而成 问题可以独立求解 动态规划与分而治之区别...和 Y[1..j] 最长公共序列长度 递推关系建立:分析最优结构 考察末尾字符: 情况1: x_i\neq y_j 时, C[i,j]=max\{ C[i,j-1],C[i-1,j] \} 情况...n\cdot m) 最长公共串:给定序列中零个或多个连续元素组成序列 蛮力枚举 序列X和序列Y各选择一个位置 依次检查元素是否匹配: 元素相等则继续匹配 元素不等或某序列已达端点...动态规划 问题结构分析: 给出问题表示: C[i,j] 表示 X[1..i] 和 Y[1..j] 中,以 x_i 和 y_j 结尾最长公共串 Z[1..l] 长度 递推关系建立:分析最优结构

23540

LeetCode(4-寻找两个正序数组中位数&&5-最长回文串&&6-Z形变换)

目录 - 寻找两个正序数组中位数 - !!!最长回文串!!!...(重点掌握) ~暴力求解 ~动态规划 ~中心扩散法 - Z形变换 寻找两个正序数组中位数 题目描述: 给定两个大小为 m 和 n 正序(从小到)数组 nums1 和 nums2。...最长回文串!!!(重点掌握) 题目描述: 给定一个字符串 s,找到 s 中最长回文串。你可以假设 s 最大长度为 1000。...示例 2: 输入: “cbbd” 输出: “bb” 暴力求解 解题思路: 当然了不动脑子的话,很容易想到暴力求解.只需要从最长字符串开始递归进行检查,看是不是回文串,如果是的话,那么就直接返回即可....这里我们就来分析一下我们怎么能快速判断一个字符串是不是回文串呢.可以看到这部分我是动态规划,所以关于动态规划,大家首先需要考虑就是找到状态转移方程!!!

39330

Python实现常见回文字符串算法

]: return False left += 1 right -= 1 return True 当然还有切片string[::-1] 最长回文串...n) 时间复杂度:尽管内层存在循环,但是内层循环只对尚未匹配部分进行,对于每一个字符来说,只会进行一次,所以时间复杂度是 O(n) 最长回文前缀 所谓前缀,就是以第一个字符开始 下面的最长回文前缀 abbabbc...def solution(s): length = longest_palindrome_prefix(s) return s[length:][::-1] + s 最长回文序列 动态规划法...dp[i][j] 表示序列 s[i..j] 中存在最长回文序列长度 初始化dp[i][i] = 1 当 s[i] == s[j] 为 true 时,dp[i][j] = dp[i+1][j -...1] + 2 当 s[i] == s[j] 为 false 时,dp[i][j] = max(dp[i+1][j], dp[i][j - 1]) # 求得最长回文序列长度 def solution(

2.1K40

C++ 动态规划经典案例解析之最长公共序列(LCS)_窥探递归和动态规划一致性

前言 动态规划处理字符相关案例中,求最长公共序列以及求最短编辑距离,算是经典中经典案例。 讲解此类问题算法在网上一抓应用一把,即便如此,还是忍不住有写此文想法。...最长公共序列(LCS) 2.1 问题描述 最长公共序列,指找出 2 个或多个字符串中最长公共序列。 如字符串 s1=kabc和s2=taijc,其最长公共序列是ac。...无论由上向下,还是由下向上,其本质都是知道子问题答案后,再求解出大问题答案。动态规划算法是直接了当,递归是迂回求解。 现以求字符串最长公共序列为例,讲解动态规划求解过程。...构建dp数组,用来记录所有问题解,类似于递归实现缓存器。...总结 最长公共序列很有代表性,分析基于递归和动态规划实现过程,可以帮助我们理解此类问题,且解决此类问题。

38920

最长回文串(Longest Palindromic Substring)——三种时间复杂度解法「建议收藏」

串:小于等于原字符串长度由原字符串中任意个连续字符组成序列 回文:关于中间字符对称文法,即“aba”(单核)、“cabbac”(双核)等 最长回文串:1.寻找回文串;2.该串是回文串中长度最长...一、O(n^3)时间复杂度方法——暴力求解 1.思想: 1)从最长串开始,遍历所有该原字符串串; 2)每找出一个字符串,就判断该字符串是否为回文; 3)串为回文时,则找到了最长回文串...后者时,将最长回文串改为low与high之间; 4)重复执行2)、3),直至high-low+1 等于原字符串长度或者遍历到最后一个字符,取当前截取到回文串,该串即为最长回文串...2.时间复杂度解释: 遍历字符:一层循环、O(n-1); 找以当前字符为中心最长回文串:嵌套两个独立循环、O(2n*(n-1)) = O(n^2)。...3)Len数组求解(线性复杂度(O(n))): a.遍历S_new数组,i为当前遍历到位置,即求解以S_new[i]为中心最长回文Len[i]; b.设置两个参数:

49710

LeetCode(4-寻找两个正序数组中位数&&5-最长回文串&&6-Z形变换)

目录 寻找两个正序数组中位数 !!!最长回文串!!!...(重点掌握) 暴力求解 动态规划 中心扩散法 Z形变换 寻找两个正序数组中位数 题目描述: 给定两个大小为 m 和 n 正序(从小到)数组 nums1 和 nums2。...最长回文串!!!(重点掌握) 题目描述: 给定一个字符串 s,找到 s 中最长回文串。你可以假设 s 最大长度为 1000。...示例 2: 输入: “cbbd” 输出: “bb” 暴力求解 解题思路: 当然了不动脑子的话,很容易想到暴力求解.只需要从最长字符串开始递归进行检查,看是不是回文串,如果是的话,那么就直接返回即可...这里我们就来分析一下我们怎么能快速判断一个字符串是不是回文串呢.可以看到这部分我是动态规划,所以关于动态规划,大家首先需要考虑就是找到状态转移方程!!!

17410

动态规划:最长回文串 & 最长回文序列

最长回文串 和 最长回文序列(Longest Palindromic Subsequence)是指任意一个字符串,它说包含长度最长回文串和回文序列。...例如:字符串 “ABCDDCEFA”,它 最长回文串 即 “CDDC”,最长回文序列 即 “ACDDCA”。 二、最长回文串 1....思路 首先这类问题通过穷举办法,判断是否是回文串并再筛选出最长,效率是很差。我们使用 动态规划 策略来求解它。...为串起始坐标,i 为串终点坐标的串是否是回文,由于我们是从子问题依次增大求解,所以求解 [i ... j] 问题时,比它规模更小问题结果都是可以直接使用了。...思路 序列问题将比串更复杂,因为它是可以不连续,这样如果穷举的话,问题规模将会变得非常,我们依旧是选择使用 动态规划 来解决。

62420

动态规划,它来了

动态规划(Dynamic Programming,DP)是运筹学一个分支,是求解决策过程最优化过程。通俗一点动态规划就是从下往上(从前向后)阶梯型求解数值。 那么动态规划和递归有什么区别和联系?...很多时候动态规划能解决问题,递归也能解决不过很多时候效率不高可能会用到记忆化搜索。 不太明白? 就拿求解斐波那契额数列来说,如果直接递归不优化,那么复杂度太多会进行很多重复计算。...对于最长递增子序列,如果不考虑动态规划方法,使用暴力枚举其实还是比较麻烦,因为你不知道遇到比前面元素是否要递增。...例如 abceef 和a2b2cee3f最长公共串就是cee。公共串是两个串中最长连续相同部分。 如何分析呢?...不同序列 不同序列也会出现,并且有些难度,前面这篇不同序列问题分析大家可以看看。 给定一个字符串 s 和一个字符串 t ,计算在 s 序列中 t 出现个数。

47720
领券