给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
题解:
- 共有两种情况的回文:"aba" "cc"
- 前一种为:递推表达式为 A[i][j] = A[i+1][j-1] + (s[i]==s[j]),单点展开回文
- 后一种为:s[i] == s[i+1],双点展开回文
- 对两种方式截取左右边界,向外扩展即可
class Solution {
public String longestPalindrome(String s) {
//递推表达式为 A[i][j] = A[i+1][j-1] + (s[i]==s[j]) 或 s[i] == s[i+1]
int n = s.length();
if(n == 0){
return s;
}
int ret = 0,start =0, end=0;
for(int i=0 ; i<n ; i++){
/*A[i][j] = A[i+1][j-1] + (s[i]==s[j])*/
int left=i-1, right=i+1;
while(left>=0 && right<n && s.charAt(left)==s.charAt(right)){
left--;
right++;
}
if(right-1-left>ret){
ret = right-1-left;
start = left+1;
end = right;
}
/*s[i] == s[i+1]*/
if(i+1<n && s.charAt(i)==s.charAt(i+1)){
left = i-1;
right = i+2;
while(left>=0 && right<n && s.charAt(left)==s.charAt(right)){
left--;
right++;
}
if(right-1-left>ret){
ret = right-1-left;
start = left+1;
end = right;
}
}
}
return s.substring(start,end);
}
}