5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
题解:中心扩展法
回文串特点:
- 回文串为奇数,有一个中心字符
- 回文串为偶数,有两个中心字符
中心扩展法: 对于字符串中任意一个字符,从中心向两端扩散,根据回文串特点,寻找以一个/两个字符为中心的最长回文串,最后取最长回文串。
/**
* 中心扩展算法
* for 0 <= i < s.length():
* 找到以 s[i] 为中心的回文串
* 找到以 s[i] 和 s[i+1] 为中心的回文串
* 更新答案
*/
public static String longestPalindrome(String s) {
String res = "";
for (int i = 0; i < s.length(); i++) {
// 以 s[i] 为中心的最长回文串
String s1 = len(s, i, i);
// 以 s[i] 和 s[i+1] 为中心的最长回文串
String s2 = len(s, i, i + 1);
res = res.length() > s1.length() ? res : s1;
res = res.length() > s2.length() ? res : s2;
}
return res;
}
/**
* 函数定义
* 寻找以s[l]和s[r]为中心的最长回文串
* 一个中心字符:l == r
* 两个中心字符:l+1 = r
*/
public String len(String s, int l, int r) {
// 防止越界
while (l >= 0 && r < s.length()) {
if (s.charAt(l) == s.charAt(r)) {
// 双指针,向两边展开
l--;
r++;
} else {
break;
}
}
// 返回以 s[l] 和 s[r] 为中心的最长回文串
return s.substring(l + 1, r);
}