【leetcode】5. 最長迴文子串
阿新 • • 發佈:2018-12-11
我們就可以在 O(n^2)O(n2) 的時間內解決這個問題。
我們觀察到迴文中心的兩側互為映象。因此,迴文可以從它的中心展開,並且只有 (2n - 1 )個這樣的中心。
你可能會問,為什麼會是 2n - 12n−1 個,而不是 nn 箇中心?原因在於所含字母數為偶數的迴文的中心可以處於兩字母之間(例如 “abba”的中心在兩個‘b’ 之間)。
示例程式碼:
#include<iostream> #include<string> using namespace std; //求字串以start為開始時的最長迴文串 int expandAroundCenter(string s, int start, int end) { while (start >= 0 && end < s.length() && (s.at(start) == s.at(end))) { start--; end++; } //因為start--和end++後此時的值已經不是迴文字元. //完整式子為(end-1)-(start+1)+1 return end - start -1; } string longestPalindrome(string s) { //定義最長迴文子字串的起始和終止位置 int start = 0, end = 0; for (int i = 0;i < s.length();i++) { int iLength = expandAroundCenter(s, i, i); int isspaceLength = expandAroundCenter(s, i, i + 1); //選最大長度 int maxLength = iLength > isspaceLength ? iLength : isspaceLength; //更新start和end; if (maxLength > end - start + 1) { //偶數長度 if (maxLength % 2 == 0) { start = (i + 1) - maxLength / 2; end = i + maxLength / 2; } else { start = i - maxLength / 2; end = i + maxLength / 2; } } } //返回迴文字串 return s.substr(start, end - start + 1); } int main() { string s1 = "babad"; string s2 = "cbbd"; cout << longestPalindrome(s1) << endl; cout << longestPalindrome(s2) << endl; return 0; }