题意:输入一个字符串S,找到S中最长的回文子串,题目简化为S的最大长度为1000且只存在唯一的最长回文子串。
思路:回文串指正着读反着读结果相同,如“cabac”,以每个位置(回文长度为奇数),两个位置的中间位置(回文长度为偶数),比较回文长度,找到长度最大的回文串(下标start, end表示)。参考https://leetcode.com/articles/longest-palindromic-substring/
public String longestPalindrome(String s) {
int start = 0, end = 0;
for(int i = 0; i < s.length(); i++){ //O(n^2)
int len1 = expandAroundCenter(s, i, i); //回文是奇数
int len2 = expandAroundCenter(s, i, i+1); //回文是偶数
int len = Math.max(len1, len2); //局部的
if(len > end - start){ //全局的,使用subString(s, start, end+1)
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end+1); //[start, end+1)
}
private int expandAroundCenter(String s, int cLeft, int cRight) {
int L = cLeft, R = cRight;
while(L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)){ //O(2cLeft) < O(n/2)
L--;
R++;
}
return (R - L - 1); //(R-1)-(L+1)+1
}