描述
给定一个字符串,输出所有长度至少为2的回文子串。
回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串。
输入
一个字符串,由字母或数字组成。长度500以内。
输出
输出所有的回文子串,每个子串一行。
子串长度小的优先输出,若长度相等,则出现位置靠左的优先输出。
样例输入
123321125775165561
样例输出
33 11 77 55 2332 2112 5775 6556 123321 165561
#include <stdio.h>
#include <string.h>char s[505]; // 定义字符数组s,用于存储输入的字符串
int len; // 定义整型变量len,用于存储字符串的长度// 判断从st开始,长度为l的子串是否为回文串
int isPalin(int st, int l) {for (int i = st, j = st + l - 1; i < j; ++i, --j) { // 使用双指针法,分别从子串的首尾向中间遍历if (s[i] != s[j]) // 如果发现不相等的字符,则返回0,表示不是回文串return 0;}return 1; // 如果所有字符都相等,则返回1,表示是回文串
}// 输出从st开始,长度为l的子串
void show(int st, int l) {for (int i = st; i <= st + l - 1; ++i) // 遍历子串中的每个字符printf("%c", s[i]); // 输出字符printf("\n"); // 输出换行符
}int main() {scanf("%s", s); // 读取输入的字符串len = strlen(s); // 计算字符串的长度for (int l = 2; l <= len; ++l) { // 遍历所有可能的子串长度for (int i = 0; i <= len - l; ++i) { // 遍历所有可能的子串起始位置if (isPalin(i, l)) // 如果当前子串是回文串show(i, l); // 输出子串}}return 0; // 程序正常结束
}