LeetCode 最长回文子串
@author:Jingdai
@date:2020.11.13
题目描述(5题)
给定一个字符串
s
,找到s
中最长的回文子串。你可以假设s
的最大长度为 1000。
示例输入
"babad"
示例输出
"bab"
注意:“aba” 也是一个有效答案。
思路及代码
动态规划
首先看这个题用动态规划怎么做。动态规划最重要的就是要找到状态转移方程。对于一个串,如果它是一个回文串,则从它前后各去掉一个字符(不考虑边界问题),它仍然是一个回文串。即若
s[i]-s[j]
是回文串,则s[i+1]-s[j-1]
也是回文串;反过来,如果要使s[i]-s[j]
是回文串,需要s[i]
和s[j]
相等并且s[i+1]-s[j-1]
是回文串。这里用一个二维数组
isPalindrome
表示子串是否是一个回文串,isPalindrome[i][j]
为true
代表s[i]-s[j]
是一个回文串。则状态转移方程为:
初始条件也很容易得到,就是当
i
和j
相等时,isPalindrome[i][j]
一定是true
。这里需要注意一点,就是遍历顺序的问题,
isPalindrome[i][j]
计算时需要用到isPalindrome[i+1][j-1]
的结果,所以isPalindrome[i+1][j-1]
必须要先遍历到,而isPalindrome[i+1][j-1]
在isPalindrome[i][j]
的左下位置,所以不能从上往下一行一行遍历,这里使用从左往右一列一列遍历。下面是具体的代码。
public String longestPalindrome(String s) { if (s == null || s.length() == 0) return null; if (s.length() == 1) return s; char[] chars = s.toCharArray(); int len = s.length(); boolean[][