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.