问题类型:动态规划
算法思想
- 适用于具有重叠子问题和最优子结构性质的问题。解决子问题,记忆化存储,便于下次查表,合并子问题的解得出原问题的解。
- 最优子结构性质:问题的最优解所包含的子问题的解也是最优的,则说该问题具有最优子结构性质,满足最优性原理。
- 子问题重叠性质:子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。
步骤
-
划分:按照问题的特征,把问题分为若干阶段。注意:划分后的阶段一定是有序的或者可排序的
-
确定状态和状态变量:将问题发展到各个阶段时所处的各种不同的客观情况表现出来。状态的选择要满足无后续性
-
确定决策并写出状态转移方程:状态转移就是根据上一阶段的决策和状态来导出本阶段的状态。根据相邻两个阶段状态之间的联系来确定决策方法和状态转移方程
-
边界条件:状态转移方程是一个递推式,因此需要找到递推终止的条件
题解
分析
作者:力扣官方题解
链接:https://leetcode.cn/problems/longest-palindromic-substring/
状态转移方程:
当前状态=前一状态+引起状态改变的因子
边界条件
代码
- 字符串长度:s.length()
- 初始化变量:
最大长度初始化为1
定义状态转移表:二维数组的定义
boolean [][]dp= new boolean [len][len]; - 将字符串转换为字符数组
char[] charArray=s.toCharArray(); - 外层循环:子串长度L
内存循环:左指针i
根据子串长度L和左指针i可确定右指针j的位置
判断s[i]、s[j] - 当为true且大于maxlen时,更新maxlen和当前子串起始位置
- 根据s.substring()方法返回子串。
substring()的作用就是截取父字符串的某一部分
public String substring(int beginIndex, int endIndex)第一个参数int为开始的索引,对应String数字中的开始位置,
第二个参数是截止的索引位置,对应String中的结束位置
1、取得的字符串长度为:endIndex - beginIndex;
2、从beginIndex开始取,到endIndex结束,从0开始数,其中不包括endIndex位置的字符