Leetcode-5-最長迴文串
阿新 • • 發佈:2022-01-17
題目連結
題目描述
求給出s中的最長迴文串
思路
-
O(n^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; } };