#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来
//要求能识别英文句号和逗号,即是说单词由空格、句号和逗号隔开。
//对已经统计好的单词数组按照字典顺序排序
void insertionSort(int A[],int N, char h[][1000])
{
int i,j,v;
char str[1000];
for(i=0; i<N; i++)
{
v=A[i];
strcpy(str,h[i]);
j=i-1;
//while(j>=0 && A[j]<v) //按照单词出现频率从高到低可以使用此条代码。
while(j>=0 && strcmp(h[j], str) > 0)
{
A[j+1]=A[j];
strcpy(h[j+1],h[j]);
j--;
}
A[j+1]=v;
strcpy(h[j+1],str);
}
}
void wordcount(char *sentence)
{
char *p;
int len=strlen(sentence); //记录句子sentence的长度。
char h[len][1000]; //建立二维字符串数组,用来存放句子中划分好的单词。
char h1[len][1000]; //用来存放后续的" "字符。
int row; //统计这句英语总共包含多少单词。
int i;
//把句子中所有字母转换成小写
for(i=0; i<len; i++)
{
p=sentence;
if(p[i]>='A'&&p[i]<='Z')
p[i]+=32;
}
//对句子中的单词进行切分。
for( i=0; i<len; i++)
{
p=sentence;
while(p&&*p!=' '&&*p!=','&&*p!='.'&&*p!='\0'&&*p!='!') //只要不遇到这些符号的时候,指针继续后移
{
++p;
}
if(' '==*p ||','==*p || '.'==*p||'!'==*p||'\0'==*p) //如果遇见',''.' ' ''\0'从此位置进行单词切分
{
*p++='\0';
strcpy(h[i],sentence); //把单词存入数组h[i]中
}
sentence=p; //切分的后半段,重新赋给句子sentence
if(strlen(h[i])) //如果划分的单词不为空
{
row=i+1; //单词数加1.
}
}
int b[row]; //用来存放句子中每个单词出现次数
int row1=0; //用来统计非重复单词个数
for(i=0; i<row; i++)
{
//b[i]=1; //每个单词至少出现1次,初始化为1
int times=1;
if(strcmp(h[i]," ")!=0) //如果str不为空
{
for(int j=i+1; j<row; j++) //从数组i之后每个数组内的单词都与str相比
{
if(strcmp(h[j],h[i]) == 0) //如果是一样的。
{
times++; //出现次数+1
// b[i]=times; //更新当前单词频次数组的值。
strcpy(h[j]," "); //这时候为了避免重复统计把h[j]换成空" "。
}
}
b[row1]=times;
strcpy(h1[row1],h[i]); //把整理好的非重复性单词存入字符串数组h1中。*其实不存也行,无非就是数组中有数值为空的数组单元,但牛客不通过,只能多此一步*
row1++; //非重复性单词的个数
}
}
row =row1;
for (i = 0; i < row; i++)
{
strcpy(h[i],h1[i]);
}
insertionSort(b, row, h);
for(i=0; i<row; i++)
{
char *q;
q=h[i];
if(strcmp(h[i]," ")!=0&&*q!='\0')
{
printf("%s:%d\n", h[i], b[i]);
}
}
}
int main()
{
char sentence[10000];
gets(sentence);
wordcount(sentence);
}