最长回文子串。
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
1 |
|
示例 2:
1 |
|
思路一
动态规划。令dp[i][j]
表示从i
到j
的子串是否为回文串,当 dp[i+1][j-1] == 1
时,如果 s[i] == s[j]
,则dp[i][j] = 1
,可以以此来判断子串是否回文。时间复杂度为 $O(n^2)$。
值得注意的是,在遍历时,需要从字符串的最后向前遍历,这样才能使用已有的结果来判断新的子串是否回文。
1 |
|
思路二
遍历一遍字符串,以每个字符为中心向两边扩散判断是否存在回文串,注意既需要判断奇数长度的回文串,也需要判断偶数长度的回文串。时间复杂度 $O(n^2)$。
1 |
|
思路三
令max_len
表示串s[0:i-1]
的最长回文串的长度,则对于串s[0:i]
来说,新增加一个字符 s[i]
,如果s[i]
是s[0:i]
最长回文串的字符,则新的最长回文串的长度可能增加2,即新的最长回文串为s[i-max_len-1, i]
,也可能增加1,即新的最长回文串为s[i-max_len, i]
。时间复杂度为 $O(n^2)$,实际时间小于思路一和思路二的时间。
1 |
|