51nodPL1单词统计
小明正在阅读一篇英语短文。为了方便学习生词,他希望能够找到每个不同单词与其在文中出现的次数,然后他觉得工作量太大了,你能用程序帮他完成吗?已知这篇文章总的单词数为n,单词忽略大小写,即:dad, DAD, Dad 算同一个单词。
输入
第一行输入一个数n,表示这篇文章总的单词数,其中 n<=100000。
第二行输入一个由'a-z','A-Z'以及空格组成的字符串,表示这篇文章,其中每个单词长度<=10。
输出
第一行输出一个正整数m,表示文中不同单词的数量;
之后按照字典序输出m行,每行一个字符串和一个数字以空格隔开,其中字符串仅由'a-z'的小写字母组成,表示这个单词;数字表示文中这个单词出现的次数。
数据范围
对于100%的数据,n<=100000,每个单词长度<=20。
输入样例
18
You better lose yourself in the music the moment You own it you better never let it go
输出样例
13
better 2
go 1
in 1
it 2
let 1
lose 1
moment 1
music 1
never 1
own 1
the 2
you 3
youself 1
脑子实在想不出来了,能帮忙解一下题嘛?(解题思路就可以了)
定义一个单词数组,以及一个单词数量数组。对于每个输入的单词,在单词数组中检索是否已经存在,存在则对应数量加1,不存在则加入数组。
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char **words,word[11];
int *num;
int n,i,m=0,j=0,t;
cin>>n;
words = new char *[n];
num = new int[n];
memset(num,0,n*sizeof(int));
for(i=0;i<n;i++)
{
words[i] = new char[11];
memset(words[i],0,11);
}
for(i=0;i<n;i++)
{
cin>>word;
j=0;
while(word[j] != 0)
{
if(word[j] >= 'A' && word[j]<='Z')
word[j] += 32;
j++;
}
for(j=0;j<m;j++)
if(strcmp(word,words[j]) == 0)
break;
if(j==m) //新单词
{
strcpy(words[m],word);
num[m] = 1;
m++;
}
else
num[j]++;
}
//排序
for(i=0;i<m-1;i++)
{
for(j=0;j<m-i-1;j++)
{
if(strcmp(words[j], words[j+1]) > 0)
{
t = num[j];
num[j] = num[j+1];
num[j+1] = t;
strcpy(word,words[j]);
strcpy(words[j],words[j+1]);
strcpy(words[j+1],word);
}
}
}
//
cout<<m<<endl;
for(i=0;i<m;i++)
cout<<words[i]<<" "<<num[i]<<endl;
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!