解题思路:
遍历string,从每一个char往两边搜索(index:left,right),记录最大回文的 left 和 length
有一点优化的地方,就是如果连续几个字符相同,那么right直接指向最右边那个字符。
如果操作的优点是,不用区分 aba 和 abba 中的b带来的操作
// C++实现:
class Solution {
public:
string longestPalindrome(string s) {
if (s.length() < 2) return s;
int maxLeft = -1;
int maxLen = 0;
for (int start = 0; start < s.length(); ){
int left = start;
int right = start;
while(right < s.length()-1 && s[right+1] == s[right]){
right ++;
}
start = right + 1;
while(left > 0 && right < s.length()-1 && s[right + 1] == s[left - 1]){
right ++;
left --;
}
if (maxLen < right - left + 1){
maxLeft = left;
maxLen = right - left + 1;
}
}
return s.substr(maxLeft, maxLen);
}
};
// Java 实现:
public class Solution {
public String longestPalindrome(String s) {
if ( s.length() < 2) return s;
char[] sc = s.toCharArray();
int maxLeft = -1;
int maxLen = 0;
for (int start = 0; start < sc.length; ){
int left = start;
int right = start;
while((right < sc.length-1) && (sc[right+1] == sc[right] )){
right ++;
}
start = right + 1;
while((right < sc.length-1 )&&( left > 0) && (sc[right+1] == sc[left-1])){
right ++;
left --;
}
if (maxLen < (right-left + 1)){
maxLeft = left;
maxLen = right-left + 1;
}
}
return s.substring(maxLeft, maxLeft + maxLen);
}
}
// Java 实现另一种办法
// 基于 回文的 中心可能是中间一个,也可能是中间一对
public class Solution {
public String longestPalindrome(String s) {
int start = 0;
int end = 0;
for (int i = 0; i < s.length(); ++i ){
int len1 = palindromeLength(s, i, i);
int len2 = palindromeLength(s, i, i+1);
int len = Math.max(len1, len2);
if ( len > end-start+1){
start = i - len/2 + ((len%2 == 0)? 1 : 0);
end = i + len/2;
}
}
return s.substring(start, end+1);
}
private int palindromeLength(String s, int start, int end){
int L = start;
int R = end;
while(L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)){
L --;
R ++;
}
return R - L -1;
}
}