5. 最长回文子串

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);
}

你可能感兴趣的:(算法,算法)