能想到的就是暴力法,但是自己也感觉时间复杂度太高达到了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版: