LC5-最长回文子串

156 阅读1分钟

题目名称:最长回文子串

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

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

示例 2:

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

提示:

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

思路分析

对于每个字符,可以尝试寻找以此字符为中心的最大回文串,回文的特点是中心对称,所以从中心出发,每找到一个回文子串,就比上一个子串长度多2,直到不是回文为止,那么就找到了以此字符为中心的最长回文子串。从头到尾遍历整个字串,就能找到最大的回文子串。

找到一个元素、两个元素为中心点,判断中心点元素是否回文,若是,则两端向外各自拓展一格继续判断,若仍是且当前长度大于历史最大值,更新最大长度并将其设为答案字串,继续重复此过程直到两端超出边界。

  1. 找最大回文串,只需要从前往后以字符串中每个字符为中心串,记录最大回文串下标。
  2. 中心串就是具有完全相同字符的字符串
  3. 找到中心串后,分别向两边扩散进行比较
  4. 由于中心串中字符相同,可以记录中心串最后位置用于返回,避免重复比较

Code实现

public static String Contains(String t, int i, int j) {
    int max = 0;
    String solution = t.substring(i, i + 1);
    while (i >= 0 && j < t.length() && t.charAt(i) == t.charAt(j)) {
        if ((j - i + 1) > max) {
            max = j - i + 1;
            solution = t.substring(i, j + 1); //更新此次中心点探测出的答案数组
        }
        i--;
        j++;
    }
    return solution;
}
public String longestPalindrome(String s) {

    int len = s.length();
    String solution = s.substring(0, 1);
    for (int i = 0; i < len - 1; i++) {
        String t1 = Contains(s, i, i); //一个中心点
        String t2 = Contains(s, i, i + 1); //两个中心点
        String tt = (t1.length() > t2.length()) ? t1 : t2; //本次两次中心点探测最终得到的结果
        solution = (solution.length() > tt.length()) ? solution : tt; //判断最后的答案数组是否需要更新
    }
    return solution;

}

结果

97老师.png

算法复杂度分析

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)