一开始用暴力法,时间复杂度是O( n 3 n^3 n3),结果显而易见,TLE,所以就去找了一下题解。
一、中间扩散法
遍历整个字符串。
从第一个开始,设置两个标签,分别标记回文串的左端和右端,同时要考虑两种情况:
1.回文串长度是偶数
2.回文串长度是奇数
于是写了下面的判定方法:
if(left>0 && s[left-1] == s[left])
{
left--;
len++;
}
if(right<k-1 && s[right+1] == s[right])
{
right++;
len++;
}
但是发现,这样写了以后,当出现输入为奇数同一字符时,如“ccccc”,会出现输出少一位的bug,即“cccc”,导致出错,于是将两个if更改为while,处理特殊情况:
while(left>0 && s[left-1] == s[left])
{
left--;
len++;
}
while(right<k-1 && s[right+1] == s[right])
{
right++;
len++;
}
整体代码如下:
char * longestPalindrome(char * s){
int left, right, max=0;
int k=0;
while(s[k] != '\0')k++;
int a[2] = {0};
int i;
for(i=0; i<k; i++)
{
int len = 1;
left = i;
right = i;
while(left>0 && s[left-1] == s[left])
{
left--;
len++;
}
while(right<k-1 && s[right+1] == s[right])
{
right++;
len++;
}
while(left > 0 && right < k-1)
{
if(s[left-1] == s[right+1])
{
left--;
right++;
len += 2;
}
else break;
}
if(len > max)
{
a[0] = left;
a[1] = right;
max = len;
}
}
static char b[1005];
int n = 0;
for(i=a[0]; i<=a[1]; i++)
{
b[n++] = s[i];
}
b[n] = '\0';
return b;
}
时间复杂度为O( n 2 n^2 n2),用到一个辅助输出的数组,空间复杂度为O(n)。