题解
-
题意: 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
-
题解:虽然长度是1000,但是如果暴力求每个子串的翻转来判断,那似乎是
O(n^3)
的复杂度,因此不可取。- 个人认为中心扩展算法是解决最长回文子串问题的最容易掌握的方法,这种算法时间复杂度是
O(n^2)
,空间复杂度是O(1)
(但是不是复杂度最优的算法,最优的算法是Manacher算法,时空复杂度都是O(n)
,但是比较复杂,需要经常看才能掌握) - 中心扩展算法:巧妙的利用了回文串的特点,就是从中心到两边扩展的过程中,两边的字符应该保持一样,比如
abcba
,从c
向左和向右扩展的过程中,两边字符是一样的,这样一来,我们就不需要将字符串进行反转,只需要遍历整个字符串,对每个字符都进行一次中心扩展判断,然后找出最长回文字串即可 - 中心选取:回文串可能是奇数长度,也可能是偶数长度,对于两者而言,中心的位置是不同的,奇数是
n/2
,如aba
的中心就是b
,偶数是(n/2-1,n/2)
两个点,如abba
的中心就是bb
,这样一来,算法就变成,对于每个i
,都判断一下以i
为中心扩展的回文串,和以(i,i+1)
为中心扩展的回文串即可
- 个人认为中心扩展算法是解决最长回文子串问题的最容易掌握的方法,这种算法时间复杂度是
-
实现:注意边界条件
class Solution {
public List<Integer> pos(String s, int n, int l, int r){
while(l >= 0 && r< n){
if