5. 最长回文子串
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "a"
输出:"a"
示例 4:
输入:s = "ac"
输出:"a"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母(大写和/或小写)组成
class Solution {
public String longestPalindrome(String s) {
String max = new String();
int tmp;
for(int i = 0; i < s.length(); ++i){
// 记录重复的字母出现的下标
tmp = s.lastIndexOf(s.charAt(i), s.length());
// 从i开始,到出现重复字母的地方进行判断是不是回文,直到找不到为止。同时要更新tmp的位置。
while(tmp != -1 && tmp >= i) {
// 如果已知有一段回文,比我最长的重复字母的字符串还要长,那么就不用看了,算了也是白算。
if(max.length() >= tmp + 1 - i){
break;
}
// 如果是回文,判断长度,修改max。因为这时候的字符串必定比我们的max长。
if(isHuiwen(s.substring(i, tmp + 1))){
max = s.substring(i, tmp + 1);
// 接下来找到的回文长度不可能有我长,就直接退出循环
if(s.length() - i <= max.length()){
System.out.println(max);
return max;
}
// 我从最长的重复字符开始查找,如果找到了,就是以这个字符开头,最长的回文
break;
}
// 修改下一个重复字母的下标位置
tmp = s.lastIndexOf(s.charAt(i), tmp - 1);
}
}
System.out.println(max);
return max;
}
public boolean isHuiwen(String str){
for(int low = 0, high = str.length() - 1; low < high; ++low, --high){
if(str.charAt(low) != str.charAt(high)){
return false;
}
}
return true;
}
}