给定一个字符串,输出所有长度至少为 2 的回文子串。
回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串。
输入格式
一个字符串,由字母或数字组成。长度 500500 以内。
输出格式
输出所有的回文子串,每个子串一行。
子串长度小的优先输出,若长度相等,则出现位置靠左的优先输出。
输出时每行末尾的多余空格,不影响答案正确性
样例输入 复制
123321125775165561
样例输出 复制
33
11
77
55
2332
2112
5775
6556
123321
165561
思想:就是用一个结构体把所有的子串都存起来 然后进行判断 是不是一个回文串如果是就输出。
注意 :题意要求长度至少为2
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char x[50000];
char tt[50101];
struct paix
{
int t;
char y[510];
}px[100000];//这里结构体就类似于一个二维数组
bool my1(paix a,paix b)
{
if(strlen(a.y)==strlen(b.y))//将字符串按从短到长排序
{
return a.t<b.t;
}
else return strlen(a.y)<strlen(b.y);//如果长度相同就靠左的优先输出
}
int my(char y[])//这个函数就是判断字符串是不是一个回文串
{
int l,i,top=0,mid,next;
l=strlen(y);
mid=l/2-1;
for(i=0;i<=mid;i++)
{
tt[++top]=y[i];
}
if(l%2==0) next=mid+1;
else next=mid+2;
for(i=next;i<l;i++)
{
if(y[i]!=tt[top])
{
break;
}
top--;
}
if(top==0) return 1;//如果是就返回1
else return 0;
}
int main()
{
int l,i,j,k,a=0,b=0;
scanf("%s",x);
l=strlen(x);
for(i=0;i<l;i++)//这里就是把每一个子串都存起来
{
for(j=i;j<l;j++)
{
for(k=i;k<=j;k++)
{
px[a].y[b++]=x[k];
}
px[a].t=a;
a++,b=0;
}
}
sort(px,px+a,my1);
for(i=0;i<a;i++)
{
int t=strlen(px[i].y);
if(my(px[i].y)&&t>=2)
{
printf("%s\n",px[i].y);
}
}
return 0;
}