题目名称:最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。
示例 2:
输入: s = "cbbd"
输出: "bb"
提示:
1 <= s.length <= 1000s仅由数字和英文字母组成
思路分析
对于每个字符,可以尝试寻找以此字符为中心的最大回文串,回文的特点是中心对称,所以从中心出发,每找到一个回文子串,就比上一个子串长度多2,直到不是回文为止,那么就找到了以此字符为中心的最长回文子串。从头到尾遍历整个字串,就能找到最大的回文子串。
找到一个元素、两个元素为中心点,判断中心点元素是否回文,若是,则两端向外各自拓展一格继续判断,若仍是且当前长度大于历史最大值,更新最大长度并将其设为答案字串,继续重复此过程直到两端超出边界。
- 找最大回文串,只需要从前往后以字符串中每个字符为中心串,记录最大回文串下标。
- 中心串就是具有完全相同字符的字符串
- 找到中心串后,分别向两边扩散进行比较
- 由于中心串中字符相同,可以记录中心串最后位置用于返回,避免重复比较
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;
}
结果
算法复杂度分析
- 时间复杂度:
- 空间复杂度: