先上题:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
一开始我是用动态规划的算法,时间复杂度是0(n2),但是这样时间复杂度太高了,后来看到一个时间复杂度为0(n)的算法,就自己实现了一遍,代码如下:
class Solution {
public:
string longestPalindrome(string s)
{
if (s.empty())
{
return 0;
}
int n = s.size();
string tmp;
tmp.push_back('#');
for (int i = 0; i < n; i++)
{
tmp.push_back('*');
tmp.push_back(s[i]);
}
tmp.push_back('*');
int size = tmp.size();
vector<int> radius(size, 0);
int index = 1;
int maxdis = 1;
for (int i = 1; i < size; i++)
{
if (maxdis - i > 0)
{
radius[i] = min(radius[2 * index - i], maxdis - i);
}
while (tmp[i - radius[i] - 1] == tmp[i + radius[i] + 1])
{
radius[i]++;
}
if (i + radius[i] > maxdis)
{
index = i;
maxdis = i + radius[i];
}
}
int maxLen = 0;
for (int i = 0; i < size; i++)
{
if (radius[i] > maxLen)
{
maxLen = radius[i];
index = i;
}
}
index = index - maxLen + 1;
index = index / 2 - 1;
return s.substr(index, maxLen);
}
};