5. 最长回文子串

74 阅读1分钟

题目

5. 最长回文子串

难度中等5210收藏分享切换为英文接收动态反馈

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

 

示例 1:

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

示例 2:

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

 

提示:

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

解法1:

public String longestPalindrome(String s) {
    String res = s.substring(0, 1);
    String tempStr = res;

    for (int i = 1; i < s.length(); i++) {
        int j = 1;

        int midIsTwo = s.charAt(i) == s.charAt(i - 1) ? 1 : 0;
        if (midIsTwo == 1) {
            tempStr = s.substring(i - 1, i + 1);
        }
        while (true) {
            if (i - j - midIsTwo < 0 || i + j >= s.length()) {
                break;
            }
            if (s.charAt(i - j - midIsTwo) == s.charAt(i + j)) {
                tempStr = s.substring(i - j - midIsTwo, i + j + 1);
                j++;
            } else {
                break;
            }
        }
        if (res.length() < tempStr.length()) {
            res = tempStr;
        }
    }

    /**
     思路:
     babad为例,依次遍历每个字符,依次往左右继续遍历,看其是否相等
     但只能满足中间只有一个字符的情况,如果中间多个字符相同则失效,比如abba,所以还需要判断中间2个字符相等的情况,于是有了上面的for循环。
     */
    for (int i = 1; i < s.length(); i++) {
        int j = 1;

        while (true) {
            if (i - j < 0 || i + j >= s.length()) {
                break;
            }
            if (s.charAt(i - j) == s.charAt(i + j)) {
                tempStr = s.substring(i - j, i + j + 1);
                j++;
            } else {
                break;
            }
        }
        if (res.length() < tempStr.length()) {
            res = tempStr;
        }
    }
    return res;
}

解法2:暴力

先枚举所有可能的子串,再判断子串是否是回文字符串,复杂度为O(N^3)

public String longestPalindrome(String s) {
    String res = "";
    int len = s.length();
    for (int i = 0; i < len; i++) {
        for (int j = i + 1; j < len + 1; j++) {
            String substring = s.substring(i, j);
            if (isHuiwen(substring) && res.length() < substring.length()) {
                res = substring;
            }
        }
    }
    return res;
}

private boolean isHuiwen(String s) {
    // aba bb bbb bbbb
    int len = s.length();
    if (len % 2 == 1) {
        return s.substring(0, len / 2).equals(new StringBuilder(s.substring(len / 2 + 1)).reverse().toString());
    } else {
        return s.substring(0, len / 2).equals(new StringBuilder(s.substring(len / 2)).reverse().toString());
    }
}