首页 > 其他分享 >力扣---5. 最长回文子串

力扣---5. 最长回文子串

时间:2022-12-11 18:58:40浏览次数:29  
标签:--- arr right int res 力扣 left 回文

给你一个字符串 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

相关文章