一、原题
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
二、中文
给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串
三、举例
如字符串ekwr abcdcba asjflasj的最大非重复子串是abcdcba
四、思路
根据回文的特性,一个大回文按比例缩小后的字符串也必定是回文,比如ABCCBA,那BCCB肯定也是回文。我们可以先把所有长度最短为1的子字符串计算出来,根据起始位置从左向右,这些必定是回文。然后计算所有长度为2的子字符串,再根据起始位置从左向右。到长度为3的时候,我们就可以利用上次的计算结果:如果中心对称的短字符串不是回文,那长字符串也不是,如果短字符串是回文,那就要看长字符串两头是否一样
五、程序
package LeetCode;
public class Leetcode005 {
public static void main(String args[]){
String str = "sdjfljsaaaddasfabcdcbaoqeiur";
System.out.println(longestPalindrome(str));
}
public static String longestPalindrome(String s) {
int maxLength = 0;
int maxStart = 0;
int len = s.length();
boolean[][] dp = new boolean[len][len];
//i表示的是字符串的长度
for(int i = 0; i < len; i++){
//j表示的是字符串的起始位置
for(int j = 0; j < len - i; j++){
//也就是字符串中只有一次字符的时候
if(i==0 || i = 1){
dp[j][j] = true;
}else if(s.charAt(j+i)==s.charAt(j)){
//如果左右两端相等,那只要中心对称子字符串是回文就是回文
dp[j][j + i] = dp[j + 1][j + i - 1];
}else{
//否则不是回文
dp[j][j+i] = false;
}
// 如果中心字符串是回文,也就是该字符串是回文的,就将该最大的长度加1
if(dp[j][j+i] && i > maxLength){
maxLength = i + 1;
maxStart = j;
}
}
}
return s.substring(maxStart,maxStart + maxLength);
}
}
------------------------output-----------------------------
abcdcba