给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
思路:中心扩散
class Solution {
public String longestPalindrome(String s) {
//扩展中心
//记录下标位置
int start = 0;int end = 0;
//判断边界值
if(s==null || s.length()<1){
return s;
}
//遍历所有char,中心扩散
//(1)abba式;(2)aba式
for(int i = 0;i<s.length();i++){
int len1 = centerExpand(s,i,i);
int len2 = centerExpand(s,i,i+1);
int len = Math.max(len1,len2);
//对于回文子串大于当前最长子串的情况再做处理
if(len>end-start){
start = i-(len-1)/2;
end = i+len/2;
}
}
return s.substring(start,end+1);
}
//中心扩散长度
public int centerExpand(String s,int left,int right){
//设置左开始下标为left;右开始下标为right
int L = left;
int R = right;
//从left向左,right向右遍历,找到满足回文格式的字符串
while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
L--;
R++;
}
//对于left == right,至少进一次循环,L--,R++之后相差为2;则需要减掉1,为本身;
//对于left != right,至少不仅一次循环,所以R-L-1=0;
return R-L-1;
}
}
网友评论