Java 最长回文子串:中心扩展法 + 5 步记忆口诀

90 阅读1分钟

以下是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
    }
}

记忆口诀

最长回文子串怎么找?中心扩展法来搞
每个字符都要试,奇偶长度都考虑
左右指针往外扩,字符相等才继续
长度计算有公式,更新边界要仔细

关键点记忆

  1. 中心扩展法:遍历每个字符,以其为中心向两边扩展
  2. 奇偶处理
    • 奇数长度:中心为单个字符(expandAroundCenter(i, i)
    • 偶数长度:中心为两个字符(expandAroundCenter(i, i+1)
  3. 长度计算
    • 起始索引:start = i - (len-1)/2
    • 结束索引:end = i + len/2