动态规划之回文串问题
以leetcode647题为例
题目解析:
子串的概念就类似子数组,是连续的不能间断的
注意这道题每一个起始位置不一样,但是字母一样,子串就不一样,类似与aaa,第一个a是一个子串,第二个a也是一个子串,不能把他们认为是相同的子串
回文子串,就是正着念和倒着念一样
讲解算法原理:
这道题有更优解的算法:
中心扩展算法时间O(n^2)空间O(1),
马拉车算法时间O(n)空间O(n),算法比较局限,只能解决回文串问题
但这个专题是动态规划,所以以动态规划进行讲解,动态规划时间和空间都是O(n^2);
创建一个二维的dp表,dp[i][j]:表示以i位置为起始,j位置为结束,判断这一段子串是否为回文子串
注意只需要判断上三角和对角线,下三角根本不用判断,重复了
需要严格限制i<=j
打情况有两种,一种是s[i]!=s[j],dp[i][j]=false;
第二种是s[i]==s[j],在细分i和j的情况
我们填dp[i][j]的时候可能用到dp[i+1][j-1]的情况,在dp表中就是左下角,所以填表时从下往上
总结
为什么我们要学习动态规划处理回文子串
原因在于我们能够将所有的子串是否是回文的信息储存在dp表里面
代码编写