这道题目,我想了非常久,但是就是没有得到时间复杂度为O(n)的算法,只能用一个O(n^2)的算法先实现一下。
先看了评论区,这道题想出O(n)的算法比较难想,其他算法最好的时间复杂度也是O(n^2),看来就需要两遍循环。这时思路就有了,第一层遍历整个字符串,找到回文中心的位置,第二层向两边扩展,判断回文的长度。
class Solution {
public:
string longestPalindrome(string s) {
if (s.size() == 0) return "";
int start = 0;
int end = 0;
for (int i = 0; i < s.size(); i++) {
int len1 = expand(s, i, i);
int len2 = expand(s, i, i + 1);
int len = max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substr(start, end-start+1);
}
private:
int expand(string s,int left,int right)
{
int l=left;
int r=right;
while(l>=0 && r<s.size() && s[r]==s[l])
{
l--;
r++;
}
return r-l-1;
}
};