題目描述:
思路
見代碼註釋
代碼
class Solution {
public:
string longestPalindrome(string s) {
//Case1:空的或者只有一個的,就是迴文,直接返回
if(s.size() == 0 || s.size() == 1)
return s;
//Case2:如果只有兩個相等的元素,也是迴文字符串,直接返回;
if(s.size() == 2 && s[0] == s[1])
return s;
//Case3:一般情況
//--Step1:先初始化變量,
int start(0), end(0);//start和end記錄迴文子串的起始位置
int maxLen(0);//maxLen用來記錄迴文子串的長度
//--Step2:遍歷尋找,【中心拓展法】
//--在findSameLength中實現
for(int i=0; i<s.size(); i++){
int len1 = findSameLength(s, i, i);
int len2 = findSameLength(s, i, i+1);
if(maxLen < max(len1, len2)){
maxLen = max(len1, len2);
start = i- (maxLen - 1) / 2;
end = i + maxLen / 2;
}
}
return s.substr(start, end - start +1);
}
int findSameLength(string &s, int left, int right){
//如果兩個位置的元素值相等,那就往兩邊擴展
while(left >= 0 && right < s.size() && s.at(left) == s.at(right)){
left--, right++;
}
//然後返回此時子串的長度,因爲相等的時候已經移動了一步,所以得到的值多1,因此再減掉1
return right-left-1;
}
};