题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
思路:将字符串转为字符数组,定义两个指针,left和right分别指向第一个元素和第二个元素,right往后移,遍历数组,每次后移,判断left和right中间是否存在回文子串,存在的时候记录回文子串的长度和最左、最右两个字符的索引,下一次获取到回文子串的时候比较该回文子串和上一次的长度,如果更长,则更新长度,以及左边界和右边界的记录。
代码:
package code;
import java.util.ArrayList;
public class Demo05 {
static String longestPalindrome(String s){
if (s.length()<1)
return null;
int left = 0;
int right = 1;
int leftTemp;
int rightTemp;
int length = 0;
int rightMax= 0;
int leftMax = 0;
boolean isPalindrome = true;
ArrayList<Character> list = new ArrayList<>();
for (int i=0;i<s.length();i++){
list.add(s.charAt(i));
}
while (right<list.size()){
while (left < right){
if (list.get(left) == list.get(right) && length < right -left){
leftTemp = left;
rightTemp = right;
//判断是否是回文串
while (rightTemp - leftTemp >=1){
if (list.get(rightTemp) != list.get(leftTemp)){
isPalindrome = false;
break;
}else {
rightTemp--;
leftTemp++;
isPalindrome = true;//这里要重置判断标志为true
}
}
if (isPalindrome){
if (right-left > length){
length =right-left;
rightMax = right;
leftMax = left;
}
break;
}
}
left++;
}
left = 0;
right++;
}
StringBuilder sb = new StringBuilder();
if (length != 0){
for (int i=leftMax;i<=rightMax;i++){
sb.append(list.get(i));
}
return sb.toString();
}else {
return sb.append(list.get(0)).toString();//没有长度大于2以上的回文串,就返回第一个字符
}
}
public static void main(String[] args) {
String str = longestPalindrome("acbcasdasdasd");
System.out.println(str);
}
}