最长回文子串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);
}
}