最長迴文子串
阿新 • • 發佈:2020-07-05
題目:最長迴文子串
問題描述:
給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。
解決思路:
本題可以採用中心擴充套件演算法:顧名思義,由於迴文串具有中心對稱的性質,所以我們可以根據字串中的某一個字元開始分別向左向右擴充套件,直到找到不相等的字元為止,這樣得到的字串即是能夠得到的最長迴文串。
我們應該注意,當迴文串的長度是偶數時,中心有n-1個;而當迴文串的長度是奇數時,中心就有n個(n為迴文串的長度):
解決程式碼:
class Solution { public static String longestPalindrome(String s) { if (s.length() < 2) { return s; } // 最長迴文子串長度 int maxLen = 0; // 迴文子串中心 int center = 0; for (int i = 0; i < s.length(); i++){ // 最長迴文串長度為奇數 int begin = centerExpand(s, i, i); // 最長迴文串長度為偶數 int end = centerExpand(s, i, i + 1); if (maxLen < Math.max(begin, end)){ center = i; maxLen = Math.max(begin, end); } } // 如果迴文子串的長度為偶數,那麼中心左邊的長度會比右邊的長度小1 return s.substring(center - (maxLen - 1) / 2, center + maxLen / 2 + 1); } private static int centerExpand(String s, int begin, int end){ while (begin >= 0 && end < s.length() && s.charAt(begin) == s.charAt(end)){ begin--; end++; } // 返回以begin和end為基準,同時向左向右擴充套件後能夠得到的最長迴文串長度 return end - begin - 1; } }