🧩Algo 多维动归

5. 最长回文子串

难度:🟡 Medium | 标签:动归、中心扩展 | 状态:⬜ LeetCode 链接

思路

中心扩展最简洁:每个位置作中心(奇心 i / 偶心 i,i+1)向两边扩,记录最长。

DP 解:dp[i][j] = (s[i] == s[j]) && (j - i < 2 || dp[i+1][j-1]),二维 O(n²) 空间。 Manacher O(n) 进阶。

代码

class Solution {
    pair<int,int> expand(const string& s, int l, int r) {
        while (l >= 0 && r < (int)s.size() && s[l] == s[r]) { --l; ++r; }
        return {l + 1, r - 1};
    }
public:
    string longestPalindrome(string s) {
        int bestL = 0, bestR = 0;
        for (int i = 0; i < (int)s.size(); ++i) {
            auto [l1, r1] = expand(s, i, i);
            auto [l2, r2] = expand(s, i, i + 1);
            if (r1 - l1 > bestR - bestL) { bestL = l1; bestR = r1; }
            if (r2 - l2 > bestR - bestL) { bestL = l2; bestR = r2; }
        }
        return s.substr(bestL, bestR - bestL + 1);
    }
};

复杂度

  • 时间 O(n²),空间 O(1)
  • Manacher O(n),但代码繁

易错 / 回顾

  • 奇心 / 偶心两套都要试
  • 扩出循环后窗口是 [l+1, r-1](左闭右闭)
  • 不要忘记偶数中心 (i, i+1)
Related · 多维动归