我的想法很常规,常规的动态规划的思想
public class Solution {
public String longestPalindrome(String s) {
if(s.length() < 2 )
return s;
int max = 0,len = s.length();
char[] sChar = s.toCharArray();
String result = s.substring(0,1);
for(int i = 0;i < len;i++){
for(int j = len - 1; j > i; j--){
if(sChar[i] == sChar[j] ){
if(isPalindrome(sChar,i,j)){
if((j+1 - i) >max){
max = j+1 -i;
result = s.substring(i,j+1);
}
break;
}
}
}
if(i + max >=len -1)
break;
}
return result;
}
public boolean isPalindrome(char[] sChar,int start,int end){
// int start = 0,end = s.length() -1;
// char[] sChar = s.toCharArray();
while(start < end){
if(sChar[start] == sChar[end]){
start++;
end--;
}else
return false;
}
return true;
}
}
discuss的想法比较好,以每个点作为回文的中心点,找与之相对的回文长度最长的子串,其实还是有剪枝的策略的,例如在当i+maxlength超过数组长度时候完全可以剪枝
public class Solution {
private int lo, maxLen;
public String longestPalindrome(String s) {
int len = s.length();
if (len < 2)
return s;
for (int i = 0; i < len-1; i++) {
extendPalindrome(s, i, i); //assume odd length, try to extend Palindrome as possible
extendPalindrome(s, i, i+1); //assume even length.
}
return s.substring(lo, lo + maxLen);
}
private void extendPalindrome(String s, int j, int k) {
while (j >= 0 && k < s.length() && s.charAt(j) == s.charAt(k)) {
j--;
k++;
}
if (maxLen < k - j - 1) {
lo = j + 1;
maxLen = k - j - 1;
}
}
}
2017/2/26