C语言寻找最长回文字串,求大佬指点
  • 板块学术版
  • 楼主LXuhdXD
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/5 20:17
  • 上次更新2024/11/5 21:42:22
查看原帖
C语言寻找最长回文字串,求大佬指点
1447405
LXuhdXD楼主2024/11/5 20:17

输入一个字符串,输出其最长回文字符串的长度和其最长回文字符串,如有多个长度相等的最长回文子串,则都输出。 例如 输入:abcdcada 输出:3 cdc ada 被难了好多天了,搞了一坨出来,求大佬帮帮

#include<stdio.h>
#include<stdlib.h>
int main()
{
	char a[101];//输入的字符串
	int i;//a[i]
	for (i = 0; i < 101; i++)
	{
		a[i] = '\0';
	}//定义并初始化初始字符串
	scanf("%s", a);//输入初始字符串

	int lena;
     lena = strlen(a);//求出a的最大长度防止越界
	int j;//a[i+-j]字符串中“移动”所需的变量
	int maxlen=2;//最长回文串的长度,2为不可取到的最小值
	int thislen=0;//某一字串的长度
	int huis[40] = {0};//存储找到的回文字串的首位数的位置i
	int huislen[40] = {0};//存储找到的回文字串的长度
	int u=0;//huis[u],huislen[u]
	//寻找奇数回文子串
	for (i = 2; a[i+2] != '\0'; i++)
	{
		for (j = 1; (i - j) >= 0 && (i + j) < lena; j++)
		{
			thislen = 1;
			if (a[i - j] == a[i + j])//左右对称,回文
			{
				thislen=thislen + 2;//左右各加一个长度
			}
			if (thislen > 1)//说明找到了回文串
			{
				huis[u] = i - j;//存储该回文首位的位置
				huislen[u] = thislen;//该回文串的长度
				u++;
			}
		}
	}
	//寻找偶数最长回文子串
	for (i = 2; a[i + 2] != '\0'; i++)
	{
		for (j = 1; (i - j) >= 0 && (i + j + 1) > lena; j++)
		{
			thislen = 2;
			if (a[i - j] == a[i + j + 1])
			{
				thislen =thislen+ 2;
			}
			if (thislen > 3)
			{
				huis[u] = i - j;
				huislen[u] = thislen;
				u++;
			}
		}
	}


	for (u = 0; u < 40; u++)
	{
		if (huislen[u] > maxlen)
		{
			maxlen = huislen[u];
		}
	}//找出最大长度

	if (maxlen > 2)
	{
		printf("%d\n", maxlen);//先输出最大长度

		for (u = 0; u < 40; u++)
		{
			if (huislen[u] = maxlen)//如果回文字串长度和最大值相等
			{
				for (j = 0; j < huislen[u]; j++)
				{
					printf("%c", a[huis[u] + j]);//输出该字串
				}
				printf("  ");
			}
		}
	}

	return 0;
}
2024/11/5 20:17
加载中...