输入一个字符串 s(长度<=200), 从左至右顺序找出 s 中所有回文串(长度>=2)并输出。
要求:
(1) 回文串必须是字母组成(大小写);
(2) 多个回文串可以部分字符重叠;
(3) 若回文串中包含回文子串,则按最大长度计算,其子串不计算在内;
(4) 在不同位置出现的相同回文串都要输出。
例如
输入:abcbacabc
输出:
abcba
cbacabc
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 5 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 6 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include <stdio.h>
#include <string.h>
int main() {
char a[250] = {0};
int i, j, s, t, u, flag = -1, last_j = 0, max = 0;
scanf("%s", a);
int len = strlen(a);
for (i = 0; i < len - 1; i++) {
if ((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')) {
max = (i > last_j) ? i : last_j;
for (u = i + 1; u < len; u++) {
if (!((a[u] >= 'a' && a[u] <= 'z') || (a[u] >= 'A' && a[u] <= 'Z')))
break;
}
j = u - 1;
if (j <= max)
continue;
else {
while (1) {
s = i;
for (; j > max; j--) {
if (j == max + 1 && a[i] != a[j]) {
flag = 2;
break;
}
if (a[i] == a[j])
break;
}
if (flag == 2) {
flag = -1;
break;
}
t = j;
for (; t > s; s++, t--) {
if ((t == s + 1 || t == s + 2) && a[s] == a[t]) {
flag = 0;
break;
}
if (a[s] != a[t]) {
flag = 1;
break;
}
}
if (flag == 1) {
j--;
flag = -1;
continue;
}
if (flag == 0) {
for (int k = i; k <= j; k++)
printf("%c", a[k]);
printf("\n");
last_j = j;
flag = 2;
}
if (flag == 2) {
flag = -1;
break;
}
}
}
} else
continue;
}
return 0;
}