题目描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
解法一:扩展中心,中心开花
我们知道回文串一定是对称的,所以我们可以每次循环选择一个中心,进行左右扩展,判断左右字符是否相等即可。
由于存在奇数的字符串和偶数的字符串,所以我们需要从一个字符开始扩展,或者从两个字符之间开始扩展,所以总共有 n+n-1 个中心。
class Solution { public static String longestPalindrome(String s) { if (s == null || s.length() == 0) { return ""; } //记录回文串的开始位置 int start = 0; //记录回文串的结束位置 int end = 0; //记录中间得到的回文串的长度 int maxLen = 0; for (int i = 0; i < s.length(); i++) { //从n+n-1个中心点开始向外扩展 int len1 = getTheLengthOfPalindrome(s, i, i); int len2 = getTheLengthOfPalindrome(s, i, i + 1); maxLen = Math.max(len1, len2); if (maxLen > (end - start)) { start = i - (maxLen - 1) / 2; end = i + maxLen / 2; } } //此处注意:subString两个参数:start为回文串开始字符,end为回文串结束索引-1 return s.substring(start, end+1); } private static int getTheLengthOfPalindrome(String s, int left, int right) { int L = left; int R = right; while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) { L--; R++; } //扩展完的回文串的长度(R-1)-(L+1)+1,所以是R-1-L return R - 1 - L; } }
复杂度分析:
~时间复杂度:O(n²)
~空间复杂度:O(1)