说实话这个题是近期遇见最耗时的一个题,为什么呢?因为这个题好多重要部分我都还没有学过,所以耗时三天(当然了,我也不是一直在做这个题,我最近有考试,在复习),它出来了!!!这个题干货很多快快上车!!!
题目描述
输入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");
}
总结
如果问题很大我们就按照模块一块一块击破,这也是程序化设计的一个思想
最后记得坚持做题!!!