您的位置:首页 > 其它

最长回文子串

2015-12-23 20:54 281 查看
[b]问题描述[/b]

给定一个字符串,求它的最长回文子串的长度。

回文串就是正着读和反着读都一样的字符串。

分析与求解

解法一 蛮力法

最容易想到的就是蛮力求解,即求出该字符串的每一个子串,再判断子串是否是回文串,找到最长的那个。其中求出每个子串的时间复杂度为O(n2),判断是否为回文串的复杂度为O(n),两者是相乘关系,所以整个算法的时间复杂度为O(n3)。

int p[100];
void init(const char *str, char *tmp)
{
tmp[0] = '@';
int len = strlen(str);
for (int i = 1; i < 2 * len; i += 2)
{
tmp[i] = '#';
tmp[i + 1] = str[i / 2];
}
tmp[2 * len + 1] = '#';
tmp[2 * len + 2] = '@';
tmp[2 * len + 3] = 0;
}

//Manacher算法计算过程
int longestPalindrome(const char *str)
{
int mx = 0, ans = 0, id = 0;
int len = strlen(str);
int longest = 0;
for (int i = 1; i <= len; i++)
{
if (mx >= i)
p[i] = min(p[2 * id - i], mx - i);
else p[i] = 1;
while (str[i + p[i]] == str[i - p[i]])
p[i]++;
if (p[i] + i > mx)
{
mx = p[i] + i;
id = i;
}
longest = max(longest, p[id]);
}
return longest - 1;
}


Manacher算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: