最长回文子串 https://leetcode.cn/problems/longest-palindromic-substring?envType=problem-list-v2&envId=2cktkvj
https://leetcode.cn/problems/longest-palindromic-substring?envType=problem-list-v2&envId=2cktkvj
给你一个字符串
s,找到s中最长的回文子串
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2:
输入:s = "cbbd" 输出:"bb"提示:
1 <= s.length <= 1000
s仅由数字和英文字母组成
package hot100;
/**
 * @author mr.cao
 * @version 1.0
 * 最长回文子串 hot5
 */
public class Solution5 {
    /**
     * 找到s的最长回文字串 s仅由数字和英文组成
     * 双指针
     * @param s
     * @return
     */
    public String longestPalindrome(String s) {
        //s = "babad"
        int length = s.length(); //存储字符串s的长度
        char[] chars = s.toCharArray(); // 字符数组
        int maxStart = 0; //记录最长回文子串的起始位置
        int maxLength = 0; //记录最长回文子串的长度
        for (int i = 0; i < length; i++) {
            //当 j = 0 时,以当前字符 chars[i] 为中心,向两边扩展寻找回文子串,适用于回文子串长度为奇数的情况。
            //当 j = 1 时,以当前字符 chars[i] 和 chars[i + 1] 为中心,向两边扩展寻找回文子串,适用于回文子串长度为偶数的情况。
            for (int j = 0; j <= 1; j++) {
                int left = i; //left 指向当前字符位置 i
                int right = i + j; //right 指向 i + j
                //使用 while 循环从中心向两边扩展,只要 left 不越界(left >= 0),right 不越界(right < length),
                // 并且 left 和 right 位置的字符相等(chars[left] == chars[right]),就继续扩展,
                // 即 left 向左移动一位(left--),right 向右移动一位(right++)
                while (left >= 0 && right < length && chars[left] == chars[right]) {
                    left--;
                    right++;
                }
                // while 循环结束后,right - left - 1 即为当前找到的回文子串的长度。
                //如果当前找到的回文子串长度大于之前记录的最长回文子串长度(maxLength < right - left - 1),
                // 则更新 maxLength 为当前回文子串的长度,更新 maxStart 为当前回文子串的起始位置(left + 1)。
                if (maxLength < right - left - 1) {
                    maxLength = right - left - 1;
                    maxStart = left + 1;
                }
            }
        }
        return s.substring(maxStart, maxStart + maxLength);
    }
}


















