0
点赞
收藏
分享

微信扫一扫

(LeetCode)最长回文子串

山竹山竹px 2022-03-12 阅读 51

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:

输入:s = "cbbd"
输出:"bb"
 

提示:

1 <= s.length <= 1000
s 仅由数字和英文字母组成

自己的解法思路:既然是回文,那么字符串的第一个字符和最后一个字符肯定是相同的,所以用两个指针标记,然后让两个向内靠近,如果指针指向的值一直相同,就判断字符串长度是否为MAX,如果是则返回两个指针。

class Solution {
    public String longestPalindrome(String s) {
        //定义两个指针和最大值
        int max = 0;
        int start = 0;
        int end = 1;
        //如果字符串为空则直接return
        if (s ==  null || s.length() == 0){
            return "";
        }
        for (int i = 0; i < s.length(); i++) {
            //取字符的ASCII值
            int index = s.charAt(i);
            //第二次循环从后开始
            for (int j = s.length() - 1; j >= i; j--) {
                int index1 = s.charAt(j);
                //用来判断头尾相同的字符串是否为回文
                boolean flag = false;
                if (index == index1 && j - i + 1 > max) {
                    int x = j;
                    int y = i;
                    while (x > y) {
                        int m = s.charAt(x);
                        int n = s.charAt(y);
                        if (m == n) {
                            y++;
                            x--;
                        } else {
                            break;
                        }

                    }
                    if (x <= y) {
                        flag = true;
                    }
                    if (flag) {
                        start = i;
                        end = j + 1;
                        max = end - start;
                        break;
                    }
                }

            }

        }
        return s.substring(start, end);
    }
}

力扣大佬 糖丶7  解法:

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;
    }
}

大概思路:如果一段字符串是回文,那么回文最中间的一个或者多个字符肯定是相同的,大佬先找到中间相同的字符或者字符串,之后用两个指针 low    high去指向字符或者字符串的头尾,再依次往外推出,并同时判断两个值是否相等,直至两个指针指向的值不相等,最后取其中最长的字符串返回。

举报

相关推荐

0 条评论