题目:
由题可得,我们要在一个字符串中找出一个最长的回文字符串(即这个字符串正过来读和反过来读是一样的),因为回文字符串也可以理解为从中间字符开始扩散遍历,左边和右边的字符是一样的,所以我们可以用中心扩展算法。
代码:
class Solution {
public String longestPalindrome(String s) {
// 用来储存最长回文字符串
String res="";
// 因为由题目可得示例1有两个长度为3的回文字符串,而最后返回的是第一个,所以我们应该从后往前遍历
for(int i=s.length()-1;i>=0;i--){
// 假设这个字符串长度为奇数,则从中心开始,它的第一个左边字符和第一个右边字符是同一个字符
String s1=huiWen(s,i,i);
// 假设这个字符串长度为偶数,则有两个中心字符,分别是当前遍历到的字符(左)和下一个字符(右)
String s2=huiWen(s,i,i+1);
// 将求得的回文字符串与当前最长回文字符串进行长度比较,来留下最长的回文字符串
res=res.length()>s1.length() ? res:s1;
res=res.length()>s2.length() ? res:s2;
}
return res;
}
public String huiWen(String s,int left,int right){
// 从中心开始遍历,遍历到数组头部或者尾部就要结束遍历
while(left>=0&&right<s.length()){
// 如果当前遍历到的两个字符相同,可以继续向两边扩散
if(s.charAt(left)==s.charAt(right)){
left--;
right++;
}else{
break;
}
}
// 返回符合的片段,因为循环中断或结束时,当前的s.charAt(left)!=s.charAt(right)或已经越界,substring截取的范围是前闭后开,所以left要+1
return s.substring(left+1,right);
}
}