PTA:7-7 输出最长对称子串对应的单词(答案以及解析)

说实话这个题是近期遇见最耗时的一个题,为什么呢?因为这个题好多重要部分我都还没有学过,所以耗时三天(当然了,我也不是一直在做这个题,我最近有考试,在复习),它出来了!!!这个题干货很多快快上车!!!

题目描述

输入1行由多个单词组成的字符串(不多于20个单词,每个单词长度不超过100),单词由至少一个连续的字母构成,单词之间用若干个空格或西文的“,”进行分隔(空格或西文的逗号“,”只是作为单词分隔符对单词进行分隔,不构成单词的组成部分)。

输出字符串中具有最长对称子串的单词(单个字母可以看成是长度为1的对称子串),若有多个单词的最长对称子串长度相同,则按单词在原字符串中的顺序进行单词输出,输出时单词之间用一个空格进行分隔,最后一个单词后面没有空格。

输入格式:

输入1行由多个单词组成的字符串,以回车结束

输出格式:

输出的单词之间用一个空格进行分隔,且最后一个单词后面没有空格。

输入样例1:

ababa,bbcbb aba 

输出样例1:

ababa bbcbb

输入样例2:

abba  abaa,  abaab 

输出样例2:

abba abaab

 题目难点

 1.这并不是只有字母的字符串,中间有逗号或者空格

2.将字符串分割出来后,如何找出其中最长对称子串数

3.怎么把分割出来的每一个字符串都比较其最长对称子串数

4.如何按正确格式输出(这也是最容易被忽略的问题)

让我们逐一击破!!! 

小提示

我们运用到的知识点有:

1.strtok函数

2.结构体以及结构体数组

3.查找一个字符串中的最长对称子串

解决方案:

难点1

这里我采用了strtok字符串分割函数 

char *token=NULL;
for(token=strtok(arr,", ");token!=NULL;token=strtok(NULL,", "))

只要遇见','或者' '就进行分割,循环条件是返回的不是空指针,每循环一次使用上一次未分割完的函数进行分割

 难点2***

将每次分割出来的字符串进行计算其中的最长字符串长度,这里我们采用了函数,这样可以让代码看起来简洁一点

这是最大的一个难点,这里我运用到我在b站上up主属于深海的鲸,学到的在每一个字符前填充一个字符串里一定不会出现的字符,然后将字符中的每一个以它为中心进行统计其中的最长对称字符

int search_number(char *ch)
{
    int len=strlen(ch);
    char chh[2*len+1];
    int i,j;
//将数组每一个都初始化为‘#’
    for(i=0;i<2*len+1;i++)
    chh[i]='#';
//这一步相当于插入字母
    for(i=1,j=0;i<2*len+1;i+=2,j++)
    {
    	chh[i]=ch[j];
	}
	int max=0;
	for(i=0;i<2*len+1;i++)
	{
		int number=1;
		while(i+number<2*len+1&&i-number>=0)//不能越界
		{
			if(chh[i+number]==chh[i-number])//相等就加
			{
				number++;
			}
			else
			break;
		}
		if(number>max)//若大于max,就将max重新赋值
		{
			max=number;
		}
	}
	return max;
}

难点3

 又有字符串本身,又有其最长对称长度,我就想到运用结构体

typedef struct word
{
    char *ch;
    int sum;
}wor;

难点4

按格式输出,那我们就分别处理呗

 if(summ==1)//若只有一个最大值
     for(i=0;i<w;i++)
    {
        if(brr[i].sum==max)
        {
            printf("%s",brr[i].ch);
        }
    }
    else//若最大值的数有多个
    { 
        int b=0;
        for(i=0;i<w;i++)
        {
            if(brr[i].sum==max)
            {
            if(b==0)
            {
                printf("%s",brr[i].ch);
                ++b;
            }
            else
                printf(" %s",brr[i].ch);
            }
        
    }
    }

既然所有难点都解决了,我们“众神合一”, 以下是完整代码

完整源代码

#include<stdio.h>
#include<string.h>
typedef struct word
{
    char *ch;
    int sum;
}wor;

int search_number(char *ch)
{
    int len=strlen(ch);
    char chh[2*len+1];
    int i,j;
    for(i=0;i<2*len+1;i++)
    chh[i]='#';
    
    for(i=1,j=0;i<2*len+1;i+=2,j++)
    {
    	chh[i]=ch[j];
	}
	int max=0;
	for(i=0;i<2*len+1;i++)
	{
		int number=1;
		while(i+number<2*len+1&&i-number>=0)
		{
			if(chh[i+number]==chh[i-number])
			{
				number++;
			}
			else
			break;
		}
		if(number>max)
		{
			max=number;
		}
	}
	return max;
}
int main()
{
    char arr[2000];
    gets(arr);
    int i;
    char *token=NULL;
    wor brr[20];
    int w=0;
    wor*pp=brr;
    for(token=strtok(arr,", ");token!=NULL;token=strtok(NULL,", "))
    {
        pp->ch=token;
        pp->sum=search_number(token);
        pp++;
        w++;
    }
    int max=0;
    int summ=0;
    for(i=0;i<w;i++)
    {
        if(brr[i].sum>max)
        {
            max=brr[i].sum;
        }
    }
    for(i=0;i<w;i++)
    {
        if(brr[i].sum==max)
        {
            summ++;
        }
    }
    if(summ==1)
     for(i=0;i<w;i++)
    {
        if(brr[i].sum==max)
        {
            printf("%s",brr[i].ch);
        }
    }
    else
    { 
        int b=0;
        for(i=0;i<w;i++)
        {
            if(brr[i].sum==max)
            {
            if(b==0)
            {
                printf("%s",brr[i].ch);
                ++b;
            }
            else
                printf(" %s",brr[i].ch);
            }
        
    }
    }
    printf("\n");
}

 总结

如果问题很大我们就按照模块一块一块击破,这也是程序化设计的一个思想

 最后记得坚持做题!!!

 

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值