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;
}