5. Longest Palindromic Substring
Question Description:
Solution:
class Solution {
public:
string longestPalindrome(string s) {
int length = s.size();
int length_maxs = 0;
int length_tmps = 0;
int maxl = -1; //为了判断字符串为“”的情况
int i = 0;
while(i < length)
{
int start = i - 1;
int end = i + 1;
while(start >= 0 && s[i] == s[start])
{
start--;
}
while(end < length && s[i] == s[end])
{
end++;
}
i = end; // 可以减少循环次数
while(start >= 0 && end < length && s[start] == s[end])
{
start--;
end++;
}
length_tmps = end - start - 1;
if(length_maxs < length_tmps)
{
maxl = start;
length_maxs = length_tmps;
}
if(length_maxs == length) // 剪枝,若最大长度等于length
break;
}
return s.substr(maxl + 1, length_maxs);
}
};
Algorithm Description
- 求出字符串
s
的长度length
- 用
i
顺序遍历s
中的每个字符 - 令
start = i - 1;
end = i + 1;
首先将start
和end
指向的元素与s[i]
进行比较,若相等分别向两端扩展 - 比较
s[start]
与s[end]
是否相等,若相等start
和end
同时向两端扩展,直到两者中任意一个到达边界或者两者不相等位置 - 将
i
的值更新为end
的值 - 每次循环结束判断最大长度与当前长度的大小,若最大长度比当前长度小,则将最大长度更新为当前长度,并将
maxl
的值更新为当前start
的值 - 结束循环后将返回
s
中起始位置为maxl + 1
长度为length_maxs
的字符串
- 当遇到字符串中含有
aaa...aaa
的情况,可直接将i
的值更新为最后一个a
所处的位置加一的值,即end
的值,我暂时不能给出证明 - 其他情况
i
总是每次递增1
Details