Loading

Leetcode-5-最长回文串

题目链接


题目描述

求给出s中的最长回文串

思路

  1. O(n^2)暴力,中心扩展。

  2. manacher算法,O(n).

C++代码

class Solution {
public:

    string longestPalindrome(string s)
    {   // 只返回长度
        if (s.length() == 0)
            return 0;
        // 预处理字符串
        string s1 = "#", ans = "";
        for (int i = 0; i < s.length(); i++)
            s1 += s[i], s1 += "#";
        int maxn = 0;           // 最大回文半径长度。减一就是原字符串的最长回文串的长度。
        int C = -1, R = -1;     // 初始化 中心 和 最右边界 
        vector<int> rArr(s1.size());       // 回文半径 数组,长度包括中心
        int len = s1.length();
        int start, end;         // 返回字符串时,标记回文串的 开始和结束
        for (int i = 0; i < len; i++) {
            rArr[i] = i < R ? min(rArr[2*C-i], R-i+1): 1;  // 区分两种大情况
            while (i+rArr[i] < len && i-rArr[i] > -1) {    // 尝试进行扩展
                if (s1[i+rArr[i]] == s1[i-rArr[i]]) 
                    rArr[i]++;
                else
                    break;
            }
            if (i+rArr[i]-1 > R) { // 更新 最右边界 和 中心
                R = i+rArr[i]-1;
                C = i;
            }
            if (rArr[i] > maxn) { // 更新答案
                maxn = rArr[i];
                start = i-rArr[i]+1;
                end = i+rArr[i]-1;
            }
        }
        for (int i = start; i <= end; i++)
            if (s1[i] != '#')
                ans.push_back(s1[i]);
        return ans;
    }
};
posted @ 2022-01-17 20:01  ARUI丶  阅读(22)  评论(0编辑  收藏  举报