题目描述:https://pycoder.blog.csdn.net/article/details/124656043
在有限的时间内,优先考虑暴力解法,超时也有分数,总比没分数且影响考试状态好。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#if 0 // 找所有子串,判断子串是否是回文子串
int strHandler(char *p, int start, int end)
{
int mid = (end - start) / 2;
for (int i = 0; i <= mid; i++) {
if (p[start + i] != p[end - i]) {
return 0;
}
}
return 1;
}
int main(void)
{
char str[1000] = {0};
int start, end;
int max = 0;
gets(str);
for (int i = 0; i < strlen(str) - 1; i++) {
for (int j = strlen(str) - 1; j > i; j--) {
if (strHandler(str, i, j) == 1) {
if (j - i > max) {
start = i;
end = j;
max = j - i;
}
break;
}
}
}
for (int i = start; i <= end; i++) {
printf("%c", str[i]);
}
printf("\n");
return 0;
}
#else // 把每个字符当作回文子串的中心,向两边扩散
int strHandler(char *p, int i, int *start, int *end)
{
int left, right;
int res = 1;
left = i - 1;
while (left >= 0 && p[left] == p[i]) {
left--;
res++;
}
right = i + 1;
while (right < strlen(p) && p[right] == p[i]) {
right++;
res++;
}
while ((left >= 0 && right < strlen(p)) && p[left] == p[right]) {
left--;
right++;
res += 2;
}
*start = left + 1;
*end = right - 1;
return res;
}
int main(void)
{
char str[1000] = {0};
int max = 0;
int res_start, res_end;
gets(str);
int tmp;
int start, end;
for (int i = 0; i < strlen(str); i++) {
tmp = strHandler(str, i, &start, &end);
if (tmp > 0) {
if (tmp > max) {
res_start = start;
res_end = end;
max = tmp;
}
}
}
for (int i = res_start; i <= res_end; i++) {
printf("%c", str[i]);
}
printf("\n");
return 0;
}
#endif