给你一个字符串 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 }
运行结果:
标签:---,arr,right,int,res,力扣,left,回文 From: https://www.cnblogs.com/allWu/p/16974146.html