xdoj 204 单词统计(四种方法) 自己的思考和各位的转载

标题
单词统计

描述
输入字符串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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lala哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值