回文子串,(纯C语言)注释质量好,包看懂,欢迎一起学习

回文子串

总时间限制: 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]);
}
发布了3 篇原创文章 · 获赞 2 · 访问量 391

猜你喜欢

转载自blog.csdn.net/qq_45772756/article/details/104123471