示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
回文
大部分会想到的情况就是abacd
其中 aba就是最长回文
但是aaccd中 aacc也是最长回文
因此 我们将所有会出现的可能性先罗列一下
- ccc
- aba
- accd
- aabb
所以对以上的情况进行归类,回文不管是长度是单数还是双数,他以回文的中心开始,必定是对称的或者是字符是相同的.
对于对称的判断,算是通用的,不管它中心是否有相同的字符,我们都要考虑是否是对称的
因此,我们只需要对相同的字符串进行判断即可.
/*
思路:
如果一个字符串是回文,那他两侧的字符一定是一样的
那我们只需要遍历所有的字符,判断两侧的字符是否相同,
左右指针接着往下走,
当指针遇到不等的时候,就右指针➖左指针
与最大的进行比较 然后存储到返回的right left
上述情况是单数的
偶数的时候就是 遇到相同的字符就可以被判定为
回文了
*/
class Solution {
public String longestPalindrome(String s) {
//返回的最长的左右指针
int tempLeft=0;
int tempRight=0;
//用来遍历str的左右指针
int left=0;
int right=0;
int len = s.length();
int maxLength = 0;
//对字符串进行遍历,视i为中心
for(int i = 0;i < len;i++){
left = i;
right = i;
//相同的情况下 左右开始遍历
//进行判断 是否有相同的字符出现
//如果有相同的字符 则一直往下走 并且比较长度
if((i+1)<len && s.charAt(i)==s.charAt(i+1)){
for (;(i+1<len)&&s.charAt(i)==s.charAt(i+1);i++){
right++;
if(maxLength < right-left+1){
tempLeft = left;
tempRight = i+1;
maxLength = right-left+1;
}
}
}
else{
right = i+1;
left = i-1;
}
for (;left>=0&&right<len;left--,right++){
if(s.charAt(left)!=s.charAt(right)){
break;
}
}
//最后一个判断,当对称的情况也已经跳出来后,就对left和right进行计算长度
if(maxLength < (right-left+1)){
maxLength = (right-left+1);
tempLeft = left+1;
tempRight = right-1;
}
}
// System.out.println(tempRight);
return s.substring(tempLeft,tempRight+1);
}
}