一.题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb示例 2:
二.解题思路
从1到字符串长度开始遍历,找每个长度可能存在的字符串。
注意:每个长度只要找到一个即可,并且注意当前长度存在回文串的条件为上次迭代存在回文串或者上上次。注意剪枝操作,否则超时(JAVA),详细看代码
三.源码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/*
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
*/
public class Solution {
public static String longestPalindrome(String s) {
int max=1; //用来记录上次最长的回文串长度
Map<Integer,String> subStringMap=new HashMap<>(); //存储当前长度对应的回文串
subStringMap.put(1,Character.toString(s.charAt(0)));
int len=s.length();
boolean flag=false; //当前迭代回文串存在的条件是,要么上次迭代存在回文串,要么上上次存在
for(int i=2;i<=len;i++){
for(int t=0;t+i<=len;t++){
if((i-1)!=max&&(i-2)!=max)
break;
if(flag){
flag=false;
continue;
}
String subString=s.substring(t,t+i);
if(check(subString)){
//注意,只要当前长度找到一个回文串就可以了,不需要再找了
max=i;
if(!subStringMap.containsKey(i)) {
subStringMap.put(i,subString);
}else
flag=true;
break;
}
}
}
return subStringMap.get(max);
}
private static boolean check(String subString){
int len=subString.length();
int mid=len/2;
for(int i=0;i<mid;i++){
//从两遍向中间靠拢对比
if(subString.charAt(i)!=subString.charAt(len-1-i))
return false;
}
return true;
}
public static void main(String args[]){
String result=longestPalindrome("babad");
System.out.println(result);
}
}