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

力扣---5. 最長迴文子串

給你一個字串 s,找到 s 中最長的迴文子串。

示例 1:
輸入:s = "babad"
輸出:"bab"
解釋:"aba" 同樣是符合題意的答案。

示例 2:
輸入:s = "cbbd"
輸出:"bb"

提示:
    1 <= s.length <= 1000
    s 僅由數字和英文字母組成

來源:力扣(LeetCode)
連結:https://leetcode.cn/problems/longest-palindromic-substring
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

如果一個字串為迴文串,那麼和它相同對稱軸的字串也必定為迴文串。

根據這一特點,可以從某一點作為對稱軸,向兩邊推最長迴文串,即:該兩邊的字元相等,則是迴文串。

程式碼如下:

 1 class Solution {
 2     public String longestPalindrome(String s) {
 3         if (s.length() == 1) {
 4             return s;
 5         }
 6         int[] res = new int[3];
 7         char[] arr = s.toCharArray();
 8         // 判斷格式為形如 aba 的迴文字串
 9         for (int i = 0; i < arr.length; i ++) {
10 find(res, arr, i, i); 11 } 12 // 判斷格式為形如 abba 的迴文字串 13 for (int i = 0; i < arr.length; i ++) { 14 find(res, arr, i, i + 1); 15 } 16 // 判斷輸出的結果,res[2] == 0 表示未更新,== 1 表示無迴文串,此時直接返回第一個字元即可, 17 // 否則根據res[0]儲存的迴文串左下標,以及res[1]儲存的右下標返回結果。
18 if (res[2] == 0 || res[2] == 1) { 19 return s.substring(0, 1); 20 } else { 21 return s.substring(res[0] + 1, res[1]); 22 } 23 } 24 25 /** 26 * 27 * @param res 儲存答案,res[0]儲存迴文字串左邊的下標,res[1]儲存迴文字串右邊的下標,res[2]儲存迴文字串的長度。 28 * @param arr char[] arr = s.toCharArray(); 29 * @param left 左邊界 30 * @param right 右邊界 31 */ 32 private void find(int[] res, char[] arr, int left, int right) { 33 // 判斷是否超過邊界 34 while (left >= 0 && right < arr.length) { 35 // 判斷是否符合迴文字串的要求,如果判斷為false,則說明對當前位置來說,已達到可能的最大回文字串長度。 36 if (arr[left] == arr[right]) { 37 left --; 38 right ++; 39 // 判斷是否更新已儲存的迴文串 40 if (res[2] < (right - left)) { 41 res[0] = left; 42 res[1] = right; 43 res[2] = right - left; 44 } 45 } else { 46 // 判斷是否更新已儲存的迴文串 47 if (res[2] < (right - left)) { 48 res[0] = left; 49 res[1] = right; 50 res[2] = right - left; 51 } 52 break; 53 } 54 } 55 } 56 }

執行結果: