动态规划之回文串问题

以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表里面 

代码编写 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值