暴力方式
public class LongestPalindromicSubstring_violent {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext()){
String s=scanner.nextLine();
System.out.println(longestPalindromicSubString(s));
}
}
private static String longestPalindromicSubString(String s){
int maxLength=0;
int start=0;
char[] chars = s.toCharArray();
for(int i=0;i<chars.length;i++){
for(int j=i;j<chars.length;j++){
if(j-i+1>maxLength&&isPalindrome(chars,i,j)){
maxLength=j-i+1;
start=i;
}
}
}
return s.substring(start,start+maxLength);
}
private static boolean isPalindrome(char[] chars,int left,int right){
while(left<right){
if(chars[left]==chars[right]){
left++;
right--;
}else{
return false;
}
}
return true;
}
}
中心扩散方式
public class longestPalindromicSubstring_midExpand {
public static void main(String[] args) {
System.out.println(lps("aaaaa"));
}
private static String lps(String s){
if(s.length()<2)
return s;
char[] chars = s.toCharArray();
int maxLength=0;
int begin=0;
for(int i=0;i<chars.length-1;i++){
int oddLength=midExpand(chars,i,i);
int evenLength=midExpand(chars,i,i+1);
if(Math.max(oddLength,evenLength)>maxLength){
maxLength=Math.max(oddLength,evenLength);
begin=i-(maxLength-1)/2;
}
}
return s.substring(begin,maxLength+begin);
}
private static int midExpand(char[] chars,int left,int right){
int length=chars.length;
while(left>=0&&right<length&&chars[left]==chars[right]){
left--;
right++;
}
return right-left-1;
}
}
动态规划
public class longestPalindromicSubstring_dp {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext()){
String s=scanner.nextLine();
System.out.println(dp(s));
}
}
private static String dp(String s){
if(s.length()<2)
return s;
int maxLength=1;
int begin=0;
int length=s.length();
char[] chars=s.toCharArray();
boolean[][] dp=new boolean[length][length];
for(int i=0;i<length;i++){
dp[i][i]=true;
}
for(int j=1;j<length;j++){
for(int i=0;i<j;i++){
if(chars[i]==chars[j]&&(j-i<3||dp[i+1][j-1])){
dp[i][j]=true;
}
if(dp[i][j]&&j-i+1>maxLength){
maxLength=j-i+1;
begin=i;
}
}
}
return s.substring(begin,maxLength+begin);
}
}