解題思路:
遍歷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;
}
}