题解 | #最长回文子串#
最长回文子串
https://www.nowcoder.com/practice/12e081cd10ee4794a2bd70c7d68f5507
//将字符串分两类,奇数长度和偶数长度,再对两种类型分别从中间向两端遍历,找最长回文串
#include <stdio.h>
#include<string.h>
int main()
{
char arr[350];
scanf("%s", arr);
int sz = strlen(arr);
int mid = sz / 2, i = 1, num = 0, count = 0;
//偶数型
for (i = 1; i <= mid+1; i++)
{
if ((arr[mid - i + 1] == arr[mid + i])&&((mid+i)<sz))
{
count+=2;
//记录最大的num
num = num > count ? num : count;
}
else
{
//往左移
mid--;
i = 0;
count = 0;
}
}
count = 0;
mid = sz / 2;
//偶数型
for (i = 1; i <= mid+1; i++)
{
if ((arr[mid - i + 1] == arr[mid + i])&&((mid+i)<sz))
{
count+=2;
num = num > count ? num : count;
}
else
{
//防止越界
if(mid<sz-1)
{
//往右移
mid++;
}
else
{
break;
}
i = 0;
count = 0;
}
}
count = 1;
mid = sz / 2;
//奇数型
for (i = 1; i <= mid; i++)
{
if (arr[mid - i] == arr[mid + i])
{
count += 2;
num = num > count ? num : count;
}
else
{
//往左移
mid--;
i = 0;
count = 1;
}
}
count = 1;
mid = sz / 2;
for (i = 1; i <= mid; i++)
{
if (arr[mid - i] == arr[mid + i])
{
count += 2;
num = num > count ? num : count;
}
else
{
//防止越界
if(mid<sz-1)
//往右移
mid++;
}
else
{
break;
}
i = 0;
count = 1;
}
}
printf("%d\n", num);
return 0;
}
查看1道真题和解析