Leetcode_Hot100_5.最长回文子串

问题类型:动态规划

算法思想

  • 适用于具有重叠子问题和最优子结构性质的问题。解决子问题,记忆化存储,便于下次查表,合并子问题的解得出原问题的解。
  • 最优子结构性质:问题的最优解所包含的子问题的解也是最优的,则说该问题具有最优子结构性质,满足最优性原理。
  • 子问题重叠性质:子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。

步骤

  1. 划分:按照问题的特征,把问题分为若干阶段。注意:划分后的阶段一定是有序的或者可排序的

  2. 确定状态和状态变量:将问题发展到各个阶段时所处的各种不同的客观情况表现出来。状态的选择要满足无后续性

  3. 确定决策并写出状态转移方程:状态转移就是根据上一阶段的决策和状态来导出本阶段的状态。根据相邻两个阶段状态之间的联系来确定决策方法和状态转移方程

  4. 边界条件:状态转移方程是一个递推式,因此需要找到递推终止的条件

题解

分析

作者:力扣官方题解
链接:https://leetcode.cn/problems/longest-palindromic-substring/

状态转移方程:

在这里插入图片描述在这里插入图片描述
当前状态=前一状态+引起状态改变的因子

边界条件

在这里插入图片描述

代码

  1. 字符串长度:s.length()
  2. 初始化变量:
    最大长度初始化为1
    定义状态转移表:二维数组的定义
    boolean [][]dp= new boolean [len][len];
  3. 将字符串转换为字符数组
    char[] charArray=s.toCharArray();
  4. 外层循环:子串长度L
    内存循环:左指针i
    根据子串长度L和左指针i可确定右指针j的位置
    判断s[i]、s[j]
  5. 当为true且大于maxlen时,更新maxlen和当前子串起始位置
  6. 根据s.substring()方法返回子串。

substring()的作用就是截取父字符串的某一部分
public String substring(int beginIndex, int endIndex)

第一个参数int为开始的索引,对应String数字中的开始位置,

第二个参数是截止的索引位置,对应String中的结束位置

1、取得的字符串长度为:endIndex - beginIndex;

2、从beginIndex开始取,到endIndex结束,从0开始数,其中不包括endIndex位置的字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值