统计难题( map解法)

Problem Description

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).

 

 

Input

输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束.

 

 

Output

对于每个提问,给出以该字符串为前缀的单词的数量.

 

 

Sample Input

 

banana

band

bee

absolute

acm

 

ba

b

band

abc

 

 

Sample Output

 

2

3

1

0

 

 

思路:这道题可以用STL中的map来做,map可以理解为一个一对一的key,value对,也叫做键值对,通常用于快速寻找一个key的对应的value是多少…mymap[key] = value     key的类型就是string的 value类型是int

map 映射, STL 中提供的模板类

map<string, int> mymap; 提供一种对应关系,就是一个string对应一个int 这种关系

比如:
"星期天" 对应 7
"星期一"对于 1
这种形式

 

下面是代码

#include<stdio.h>

#include<map>

#include<string.h>

#include<algorithm>

using namespace std;

 

map<string,int>m;//map的格式

int main()

{

  char a[100];

    while(gets(a))// //不能用scanf("%s",str);因为scanf()不会读取换行,会跳过空白行,就没有长度为0的字符串,而gets会读取换行(但不会保存到数组中),存在长度为0的字符串

    {

        if(a[0]=='\0')//换行符就跳出循环

            break;

        int len=strlen(a);//获取字符串长度

        for(int i=len-1;i>=0;i--)//从每个前缀找

        {

             m[a]++;

             a[i]='\0';//这段代码的意思是将某一字符数组中的字符你从后往前去掉

        }//这一段代码的意思是比如将banana存入map,然后删除最后一个字母a,然后存入banan,再删除n,存入bana,以此类推,到输入第二个字母band时,存入band,删除最后一个字母d,存入ban,因为和之前存入的ban相同,所以m[a]会++,可以在这里加入一行代码查看m[a]的变化情况

   

}

    while(~scanf("%s",a))

    {

        printf("%d\n",m[a]);

    }

    return 0;

}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值