最長(zhǎng)回文子串的求解,主要有這四種方法:
1.暴力求解
羅列所以可能的子串,一一判斷是否是回文。 O(n^3)
2.動(dòng)態(tài)規(guī)劃
回文字符串的子串也是回文,比如P[i,j](表示以i開始以j結(jié)束的子串)是回文字符串,那么P[i+1,j-1]也是回文字符串。這樣最長(zhǎng)回文子串就能分解成一系列子問(wèn)題了。這樣需要額外的空間O(N^2),算法復(fù)雜度也是O(N^2)。
(這是抄的)
3.中心擴(kuò)展
以每一個(gè)字符做中心向兩邊擴(kuò)展,分奇數(shù)個(gè)字符和偶數(shù)個(gè)字符兩種情況
4.Manacher法
這里用第三種 比較好實(shí)現(xiàn)
class Solution {public: string longestPalindrome(string s) { int size = s.size(); int max = 0, start = 0; //odd for (int i = 0; i < size; ++i) { int count = 0, len = 0; while(i - count >= 0 && i + count < size){ if(s[i - count] == s[i + count]){ len = 2 * count + 1; count++; } else break; } if(len > max){ max = len; start = i - count + 1; } } //cout << max << " " << start << endl; //even //cout << "~~" << endl; for (int i = 0; i < size; ++i) { int left = i, right = i + 1, count = 0, len = 0; while(left - count >= 0 && right + count < size){ if(s[left - count] == s[right + count]){ len = 2 * count + 2; count++; } else break; } if(len > max){ max = len; start = i - count + 1; } } //cout << max << " " << start << endl; string ans = s.substr(start, max); return ans; }};
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注