1. 程式人生 > 其它 >Leetcode-5-最長迴文串

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;
    }
};