回文子串
总时间限制: 1000ms 内存限制: 65536kB
描述
给定一个字符串,输出所有长度至少为2的回文子串。
回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串。
输入
一个字符串,由字母或数字组成。长度500以内。
输出
输出所有的回文子串,每个子串一行。
子串长度小的优先输出,若长度相等,则出现位置靠左的优先输出。
样例输入
123321125775165561
样例输出
33
11
77
55
2332
2112
5775
6556
123321
165561
(纯C语言)注释质量好,包看懂,欢迎一起学习
#include<stdio.h>
#include<string.h>
//全局变量,因为不想弄成子函数的实参所以就使用了全局变量
char string[500]; //代表输入的字符串
int flag_have=0; //用来控制第一个输出字符不是换行而是输出回文串。
void scan_huistring(int printf_long,int scanf_long);
void printf_huistring(int printf_strat,int printf_last);
int main()
{
int string_long,scan_long=0,i; //string_long代表输入的字符串的字符串长度; scan_long代表当前扫描字符串数组的位置
scanf("%s",string);
string_long=strlen(string);
for(i=2;i <= string_long;++i) //这个循环代表从回文串长度为2开始循环
{
for(scan_long=0;(scan_long+i-1) < string_long;scan_long++) scan_huistring(i,scan_long);
}
return 0;
}
//**********
//函数: void scan_huistring(int printf_long,int scan_long)
//作用: 将字符串分为各个待检测的回文串,判断是否是回文串
//输入: 当前输出回文符的长度 ; 当前扫描字符串的位置
//输出:无
//**********
void scan_huistring(int printf_long,int scan_long)
{
int j=scan_long,i=scan_long+printf_long-1,flag_huistring=1; //j~i为表示将字符串分为各个待检测的回文串的开始位置~结尾位置
for(;j < i;j++,i--) //从开始位置和结尾位置开始对比字符是否相同
{
if(string[j] != string[i])
{
flag_huistring=0; //0代表不是回文串,1代表是回文串
break;
}
else continue;;
}
if(flag_huistring==1) //如果是回文串
{
if(flag_have == 1) printf("\n"); //这里控制第一行不输出换行
flag_have=1; //这里控制往后输出回文串前输出换行
printf_huistring(scan_long,scan_long+printf_long-1); //回文串输出函数
}
}
//**********
//函数: void scan_huistring(int printf_long,int scan_long)
//作用: 回文串输出函数
//输入: 输出初始位置,输出结束位置
//输出:无
//**********
void printf_huistring(int printf_strat,int printf_last)
{
for(;printf_strat <= printf_last;++printf_strat) printf("%c",string[printf_strat]);
}