一. 题目

二. 思路

1. 暴力

  • 枚举中心(单个为中心和两个为中心),然后向两侧扩展。

  • O(n^2)

2. 区间DP

  • f[i,j]:i,j这段是不是回文串

  • 若f[i+1, j-1]==true, 且a[i]==a[j],则f[i,j]=true

  • O(n^2)

3. 二分+字符串哈希

  • 二分最大字符串长度:二段性:若小的长度能满足,才可能更大。

  • 使用字符串哈希O(1)判断是否为回文。

  • O(nlog^n)

三. 代码

2. 区间DP

class Solution
{
    static final int N = (int) 1e3 + 10;
    boolean[][] f = new boolean[N][N];

    /*
        //区间DP
        f[i,j]:i,j这段是不是回文串
        若f[i+1, j-1]==true, 且a[i]==a[j],则f[i,j]=true
        else f[i, j]=false
     */
    public String longestPalindrome(String s)
    {
        int n = s.length();
        for (int i = 0; i < n; ++i)
            Arrays.fill(f[i], false);

        int ans = 1;
        String anss = s.substring(0, 1);
        for (int len = 1; len <= n; ++len)
            for (int l = 0; l + len - 1 < n; ++l)
                if (len == 1) f[l][l] = true;
                else if (len == 2 && s.charAt(l) == s.charAt(l + 1))
                {
                    f[l][l + 1] = true;
                    if (ans < 2)
                    {
                        ans = 2;
                        anss = s.substring(l, l + 2);
                    }
                } else if (len >= 3)
                {
                    int r = l + len - 1;
                    if (f[l + 1][r - 1] && s.charAt(l) == s.charAt(r))
                    {
                        f[l][r] = true;
                        if (ans < r - l + 1)
                        {
                            ans = r - l + 1;
                            anss = s.substring(l, l + len);
                        }
                    }
                }
        return anss;
    }
}

3. 二分+字符串哈希