标题
单词统计
描述
输入字符串string[N](N≤100),各个单词以空格隔开,单词长度小于等于8,输入单词word[M](M≤8),在string中查找出相同的单词并统计该单词出现的次数信息,输出单词和出现次数的信息, 数据之间空一格空格。主函数输入字符串和待统计单词,编写函数count()实现统计和信息输出。
时间限制
1
内存限制
10000
类别
1
输入说明
输入一行字符以空格隔开各个单词,输入要统计的单词。
输出说明
格式输出:输出单词及其出现的次数信息,数据之间空一格。
输入样例
dog cat dog dog the abc dog hahe
dog
输出样例
dog 4
①自己的想法(比较规矩)
比较容易忽略的就是必须一模一样(单词大小写不要求转换),
所以要考虑多种可能性
比如:abcde bdce bde bcdef bcde
bcde
那么这之中符合条件的只有1个
所以写代码时要注意加条件筛选
#include <stdio.h>
#include<string.h>
int main()
{
int m,n;
int i,j,k,cout=0,num=0;
char a[100],w[8];
gets(a);
gets(w);
n=strlen(w);
m=strlen(a);
for(i=0;i<m;i++){
cout=0;
if(a[i]==w[0]&&(a[i-1]==' '||i==0))
//保证单词下一个字符是空格或到结尾,且单词上一个字符是空格或者是起始点
//注意单词的首字母(保证一定是首字母)等于w的首字母才进入
{for(j=0;a[i+j]!=' '&&a[i+j]!='\0';j++){
if(a[i+j]==w[j])//保证一个完整的单词进行比较,否则后有多余
cout++;
}
}
if(cout==n&&j==n)//单词长度一样,没有多余
num++;
}
printf("%s %d",w,num);
return 0;
}
②使用二维数组a[i][j],其中i为单词的个数,a[i]代表第i个单词
转自 https://blog.csdn.net/yingmu__/article/details/108040190
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void) {
char array[100][9];//
char str[1000];
char flag[9];
int i,num,index,count;
gets(str);
gets(flag);
//提取单词
num=index=0;
for(i=0; i<strlen(str); i++) {
if(str[i]!=' ') {
array[num][index]=str[i];
index++;
} else { //碰到空格即为一个单词
array[num][index]='\0';
num++;
index=0;
}
}
array[num][index]='\0';//最后一个单词没有空格
//统计次数
count=0;
for(i=0; i<=num; i++) {
if(strcmp(array[i],flag)==0) {
count++;
}
}
printf("%s %d",flag,count);
return 0;
转自 https://blog.csdn.net/yingmu__/article/details/108040190
}
③在②的基础上使用字符串比较函数 strcmp(a[i],w)
strcmp(s1,s2)
- 自左向右逐个按照ASCII码值进行比较,直到出现不同的字符或遇’\0’为止。
- 如果返回值 < 0,则表示 s1 小于 s2。
- 如果返回值 > 0,则表示 s1 大于 s2。
- 如果返回值 = 0,则表示 s1 等于 s2。
转自 https://blog.csdn.net/weixin_51488007/article/details/121600384
#include<stdio.h>
#include<string.h>
int main()
{
char pi[20][20], exam[20];
int i =0, j = 0;
do
{
scanf_s("%s", pi[i], 20);
i++;
}while (getchar()!='\n');
//for (int k = 0; k < i; k++)
//puts(pi[k]);测试输出
gets_s(exam,20);
int count = 0,nu=strlen(exam);
for (int j = 0; j <= i; j++) {
if (strcmp(pi[j], exam) == 0)
count++;
}
printf("%s %d", exam, count);
return 0;
}
————————————————
版权声明:本文为CSDN博主「如库~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_51488007/article/details/121600384
④在②的基础上使用自动机
通过switch函数一步步筛选,由于该题下对于字符而言有三种情况:
1)字符为空格;2)字符不是单词中的字符;3)字符符合单词中字符;
@
这位大大写的非常详细,很幽默哈哈
其实自动机看似复杂,但理解运行原理后还是比较容易理解的(●'◡'●)
转自 https://blog.csdn.net/qq_45836372/article/details/103561950
//转自 https://blog.csdn.net/qq_45836372/article/details/103561950
#include <stdio.h>
#include <string.h>
#define SPACE 0 //空格状态
#define LETTER -1 //字母状态,但是这表示不是要查找的单词的字母的状态
#define WORD 1 //而这种状态是要查找的单词的状态
//当然了,如果状态时大于1的数,说明是要查找的单词的中间部分的状态,上文讲过了
void count(char *str,char *word) //题目要求额外编写函数,其实都一样,OJ只看结果是否正确
{
int state=0,ans=0,i; //state表状态,先假设是空格,因为空格上来就判断是不是三种状态(中的某种状态)
int len=strlen(word);
for(i=0;str[i];++i) //遍历数组,让一个又一个参赛者(单词)接受洗礼
{
switch(state)
{
case(SPACE): //(如果上一个字母是空格)欢迎下一位参赛者入场
if(str[i]==word[0])state=WORD; //(如果这一个字母是所查的单词的第一个字母)恭喜这位参赛者踏过门槛
else if(str[i]==' ')state=SPACE; //(其实这句话可以省略,因为反正都是空格状态,改它是一样的)坐等下一位参赛者入场
else state=LETTER; //(剩下的肯定是其他字母状态了)连门槛都过不了,out
break;
case(LETTER): //(是其他字母状态)这位参赛者已经out了,现在正在求情
if(str[i]==' ')state=SPACE; //求情无效,坐等这位参赛者自行退场
break;
default: //(是要查找的单词状态)已经踏过门槛的参赛者开始接受洗礼或正在接受洗礼
if(state<len) //(还不是最后一个字母)还没有达到最后一关
{
if(str[i]==' ')state=SPACE; //这位参赛者缺乏信心,自行退场了
else if(str[i]==word[state])++state; //(变成下一个字母状态)这位参赛者成功通过这一关,继续闯关
else state=LETTER; //这位参赛者闯关失败,out
}
else if(state==len) //(是最后一个字母)BOSS关
{
if(str[i]==' ') //(如果下一个是空格,找到了!)闯关成功!
{
ans++; //通关的参赛者数加一
state=SPACE; //(状态不要忘记改变)膜拜成功人士的背影,并为下一位参赛者入场做准备
}
else
{
state=LETTER; //可惜,这位参赛者兴奋过头,裁判一怒之下令其退场
}
}
}
}
if(state==len) //最后一位参赛者的评判结果还没出来呢
{
ans++;
}
printf("%s %d",word,ans);
}
int main()
{
char word[9],str[101];
gets(str);
gets(word);
count(str,word);
return 0;
}