最长回文子串-动态规划法

本文介绍了如何使用动态规划法解决最长回文子串问题,详细阐述了问题描述、分析、动态规划求解的过程,并给出了具体示例和代码实现。
摘要由CSDN通过智能技术生成

动态规划法

问题有n个输入,问题的解由这n个输入的子集(可行解)组成,这个子集满足事先给定的约束条件。满足约定条件的可行解可能不止一个,用目标函数评价这些可行解的优劣,使目标函数取得极值的可行解称为最优解。

求解过程往往可以划分为若干个阶段,每个阶段的决策仅依赖与前一个阶段的状态,各子问题的解只与它前面的子问题的解相关,而且各子问题的解都是相对于当前状态的最优解,整个过程的最优解是由各个子问题的最优解构成。

动态规划法中每个子问题对应决策过程的一个阶段,将子问题的解求解一次并填入表中,当需要再次求解此问题时可以通过查表获得该子问题的解(以空间换时间),从而避免大量重复计算。

动态规划法的求解过程一般由三个阶段组成

  1. 划分子问题:将原问题分解成若干个子问题,每个子问题对应一个决策阶段,并且子问题之间具有重叠关系
  2. 确定动态规划函数:根据子问题之间的重叠关系找到子问题满足的递推关系式(即动态规划函数)
  3. 填写表格:设计表格,以自底向上的方式计算各个子问题的解并填表

最长回文子串问题描述:

给你一个字符串s(s仅由数字和英文字母组成),找到s中最长的回文子串

  • 示例1:

    输入:s=“babad”

    输出:“bab”

    解释:"aba"同样是符合题意的答案

  • 示例2:

    输入:s=“cbbd”

    输出:“bb”

问题分析:

  • 输入:字符串s

  • 约束条件:子串是回文串

  • 可行解:字符串s中的回文子串

  • 目标函数:max(length)

动态规划求解

  • 划分子问题:若s[ i : j ]是回文串则s[ i+1 : j-1 ]一定是回文串,若s[ i+1 : j-1 ]是回文串且s[ i ]===s[ j ]则s[ i : j ]是回文串.可得判断s[ i : j ]是否为回文串,只需判断s[ i+1 : j-1 ]是否为回文串且s[ i ]是否与s[ j ]全等。若s[ i ]===s[ i+1 ]则s[ i : j ]是回文串

  • 动态规划函数:L[i]表示以s[i]为右边界的回文串长度集合,

​ 单个字符本身也是回文串 L[ i ] [ 0 ]=1

​ L[ i ] [ j+1 ]=L[ i-1 ] [ j ]+2 (s[ i ]===s[ i - L[ i-1 ] [ j ] - 1 ]&&( i - L[ i-1 ] [ j ] - 1 )>=0)

​ L[ i ] [ j+1 ]=L[ i-1 ] [ j ]+1 (s[ i ]===s[ i - L[ i-1 ] [ j ]]&&( i - L[ i-1 ] [ j ])>=0&&s[ i - L[ i-1 ] [ j ]]~~s[ i ]全相等 例:“aaaaaa”)

代码:

var longestPalindrome = function(s) {
   
    let len=s.length;
    let maxLenNum=[];
    maxLenNum[0]=new Array(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值