Leetcode 5 - 最長回文子串
題目:
給定一個字符串,找出其最長的回文子串
所謂回文,即正反兩個方向讀結果是一致的。舉兩個例子
"aba"
"abba"
這兩個例子代表著回文的奇偶兩種形式,對后文的算法也有影響。
在諸多求解這個問題的算法中,個人認為最容易理解,同時性能也較好的是中心擴展法,即:
依次以字符串每一個位置為中心,向兩側擴展,直到兩側字符不同。
要注意兩點:
- 需要考慮奇偶兩種情況。
- 對空串單獨考慮
以下為C++代碼實現
class Solution {
public:
int searchAround(string& s, int i, int j){
int cnt = 0;
while(i > 0 && j < s.size()-1){
if(s[--i] == s[++j]){
cnt++;
} else {
return cnt;
}
}
return cnt;
}
// 中心擴展法
string longestPalindrome1(string s) {
if (s == "") return "";
int sstart = 0;
int slen = 1;
for(int i=0; i < s.size(); ++i){
int half = searchAround(s, i, i);
int l1 = 2 * half + 1;
if (l1 > slen){
sstart = i - half;
slen = l1;
}
}
for(int i=0; i < s.size()-1; ++i){
if(s[i] == s[i+1]){
int half = searchAround(s, i, i+1);
int l1 = 2 * half + 2;
if (l1 > slen){
sstart = i - half;
slen = l1;
}
}
}
return s.substr(sstart, slen);
}
};
在代碼中做了兩輪循環,分別考慮奇偶兩種情況。searchAround函數會返回單側的最大長度half,因此,對奇數情況的子串長度為2 * half + 1,對偶數情況的子串長度為2 * half + 2,子串起點均為i-half。
Listen to your heart.

浙公網安備 33010602011771號