问题 E: 字符串碎片(字符串)
一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,”aaabbaaac”是由下面碎片组成的:”aaa”,”bb”,‘c’。输入字符串,请计算字符串的所有碎片及所有碎片的平均长度。
所有碎片的平均长度 = 所有碎片长度之和/碎片个数
输入
测试次数t
每组测试数据为一行字符串
输出
对每组测试数据,输出字符串中按顺序出现的碎片和所有碎片的平均长度(相同碎片只输出一次,平均长度保留2位小数)。
样例输入
4
aaabbaaac
szuszuszuszu
aaaaaa
apple
样例输出
aaa bb c 2.25
s z u 1.00
aaaaaa 6.00
a pp l e 1.25
hint:
我们先解决平均长度这个问题,其实平均长度只要算出有多少个不同的字符串碎片,字符串总长度/字符串碎片个数
然后我们想办法输出字符串碎片,我们只要先把字符串用一维字符数组的形式输入,然后把每个字符串碎片转化为二维数组里面的每一行,再输出这个二维数组就好了
**这里有一个难点那就是如果有两个字符串碎片是一样的那只能算一种只能输出一次的问题,看代码解析
#include<stdio.h>
#include<string.h>
int main()
{
int i,t,n,m;
scanf("%d",&t);
getchar();
while(t--)
{
char arr[100]={'\0'},brr[20][20]={'\0'};
//最后字符数组初始化时定义成都为'\0',这样在后面的操作中就不用封口。
gets(arr);
double l=strlen(arr);
for(i=0,n=0,m=0;i<strlen(arr);i++,m++)
{
brr[n][m]=arr[i];
if(arr[i]!=arr[i+1])
{
n++;
m=-1; //这里不是0,因为for哪里还会加一的
}
}
/*这里是重点,每次输出时先用strcmp函数判断是否与之前的字符串碎片相同,是否已经输出过了。*/
for(int j=0;j<n;j++)
{
int mark=1;
for(int k=0;k<j;k++)
{
mark=strcmp(brr[j],brr[k]);
if(mark==0)
break;
}
if(mark!=0)
printf("%s ",brr[j]);
}
printf("%.2lf\n",l/n);
}
return 0;
}