以下是Java实现最长回文子串的代码,添加了便于快速记忆的注释和口诀:
代码实现(中心扩展法)
public class LongestPalindrome {
public String longestPalindrome(String s) {
if (s == null || s.length() < 1) return "";
int start = 0, end = 0; // 最长回文子串的起始和结束索引
// 遍历每个字符,以其为中心扩展
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i); // 奇数长度回文串
int len2 = expandAroundCenter(s, i, i + 1); // 偶数长度回文串
int len = Math.max(len1, len2);
// 更新最长回文子串的边界
if (len > end - start + 1) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
// 从中心向两边扩展,返回最长回文串的长度
private int expandAroundCenter(String s, int left, int right) {
while (left >= 0 && right < s.length()
&& s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
return right - left - 1; // 实际长度为 right - left + 1 - 2
}
}
记忆口诀
最长回文子串怎么找?中心扩展法来搞
每个字符都要试,奇偶长度都考虑
左右指针往外扩,字符相等才继续
长度计算有公式,更新边界要仔细
关键点记忆:
- 中心扩展法:遍历每个字符,以其为中心向两边扩展
- 奇偶处理:
- 奇数长度:中心为单个字符(
expandAroundCenter(i, i)) - 偶数长度:中心为两个字符(
expandAroundCenter(i, i+1))
- 奇数长度:中心为单个字符(
- 长度计算:
- 起始索引:
start = i - (len-1)/2 - 结束索引:
end = i + len/2
- 起始索引: