【每日一題】【奇偶中心分別擴充套件】最長迴文子串-211104/220205
阿新 • • 發佈:2022-02-06
給你一個字串 s,找到 s 中最長的迴文子串。
https://leetcode-cn.com/problems/longest-palindromic-substring/
最新解法:奇偶分別向兩端擴充套件
public String longestPalindrome(String s) { int[] range = new int[2]; int n = s.length(); for(int i = 0; i < n; i++) { int[] ji = getLen(s, i, i + 1);int[] ou = getLen(s, i - 1, i + 1); if(ji[1] - ji[0] > ou[1] - ou[0]) { if(ji[1] - ji[0] > range[1] - range[0]) { range[1] = ji[1]; range[0] = ji[0]; } } else { if(ou[1] - ou[0] > range[1] - range[0]) { range[1] = ou[1]; range[0] = ou[0]; } } } return s.substring(range[0], range[1] + 1); } public int[] getLen(String s, int l, int r) { while(l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) { l--; r++; } if (++l >= 0 && --r >=0) { return new int[] {l, r}; } else { return new int[2]; } }
之前解法:兩端擴散
class Solution { public String longestPalindrome(String s) { if (s == null || s.length() == 0) { return ""; } // 儲存起始位置,測試了用陣列似乎能比全域性變數稍快一點 int[] range = new int[2]; char[] str = s.toCharArray(); for (int i = 0; i < s.length(); i++) { // 把迴文看成中間的部分全是同一字元,左右部分相對稱 // 找到下一個與當前字元不同的字元 i = findLongest(str, i, range); } return s.substring(range[0], range[1] + 1); } public static int findLongest(char[] str, int low, int[] range) { // 查詢中間部分 int high = low; while (high < str.length - 1 && str[high + 1] == str[low]) { high++; } // 定位中間部分的最後一個字元 int ans = high; // 從中間向左右擴散 while (low > 0 && high < str.length - 1 && str[low - 1] == str[high + 1]) { low--; high++; } // 記錄最大長度 if (high - low > range[1] - range[0]) { range[0] = low; range[1] = high; } return ans; } }
本文來自部落格園,作者:哥們要飛,轉載請註明原文連結:https://www.cnblogs.com/liujinhui/p/15510774.html