最开始的想法是暴力求解最长的回文子串,具体的思路如下
class Solution {
public String longestPalindrome(String s) {
String result = "";
if(s.length()==1){
return s;
}
for(int i=0;i<s.length();i++){
for(int j=i;j<s.length();j++){
String temp = s.substring(i,j+1);
if(plaindrome(temp) && result.length()<temp.length()){
result = temp;
}
}
}
return result;
}
public boolean plaindrome(String temp){
int start = 0;
int end = temp.length()-1;
while(end > start){
if(temp.charAt(start) == temp.charAt(end)){
start++;
end--;
}else{
return false;
}
}
return true;
}
}
复制代码
后来考虑回文的验证方式,要么是奇数的回文,要么是偶数的回文,反正回文必须满足,若该串是回文,则向左向右各一个字符相等也必然是回文。
class Solution {
public String longestPalindrome(String s) {
String result = "";
int len = s.length();
if(len == 1){
return s;
}
for(int i=0;i<len;i++){
for(int j=0;i-j>=0&&i+j<len;j++){
if(s.charAt(i-j) == s.charAt(i+j)){
result = result.length() < 2*j+1 ? s.substring(i-j, i+j+1) : result;
}else{
break;
}
}
}
for(int i=1;i<len;i++){
if(s.charAt(i-1) == s.charAt(i)){
for(int j=0;i-j-1>=0&&i+j<len;j++){
if(s.charAt(i-j-1) == s.charAt(i+j)){
result = result.length() < 2*j+2 ? s.substring(i-j-1, i+j+1) : result;
}else{
break;
}
}
}
}
return result;
}
}
复制代码
此外还有一种比较复杂的求解方式是通过Manacher算法,该算法目前还没有看懂。