最长回文子串。
给定一个字符串 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 | |