05-最长回文子串

能想到的就是暴力法,但是自己也感觉时间复杂度太高达到了O^3,耗时800ms,太慢了,然后看的题解,提到了一个很久以前就听说过的词:动态规划

           首先声明一个二维数组用来保存状态[][]bool ,因为单个字符串肯定是回文的,所以dp[i][i]一定为true,如果s[i] == s[i+1]那么dp[i][i+1]=true,第一次遍历先将初始状态设置好,然后长度从3开始直到s的长度。从其他资料学习了动态规划后理解就是当前状态要依赖于前一个状态,如果dp[i+1][j-1]是回文(i为起始位置,j为结束位置),而且s[i] == s[j],那么dp[i][j]也是回文,于是得到了动态规划的关键,状态转移方程:

      然后就是求长度为3是否有回文,4是否有回文,一直到len(s). 这里就体现了dp的好处了,如果长度为3时是回文,那么再求长度为4的时候可以直接利用前面的结果而不需要再算一次。例如cabac,长度为3时的回文是dp[1][3],也就是aba,那么长度为4的时候当i=0时,dp[0][3]的前一个状态dp[1][2]不是回文,i=1时,dp[1][4]的前一个状态dp[2][3]也不是回文,这样下去,当长度为4时并没有长度为4的回文,所以此时长度为4时的最长回文也是dp[1][3],当长度为5时,dp[0][4]的前一个状态为dp[1][3]是回文,而s[0]==s[4],所以dp[0][4]是回文,更新最大长度,更新开始位置为0,到此就求出了最长回文串

代码如下:

 

 

java版:

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值