2.27单词识别

本文介绍了一种使用Map数据结构统计英文句子中单词出现频率的方法,对比了使用vector和map的不同实现方式,详细解释了如何处理大小写、特殊字符及单词划分等问题。

题目描述
输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来,要求能识别英文句号和逗号,即是说单词由空格、句号和逗号隔开。

输入描述:
输入有若干行,总计不超过1000个字符。

输出描述:
输出格式参见样例。

示例1

输入

A blockhouse is a small castle that has four openings through which to shoot.

输出

a:2
blockhouse:1
castle:1
four:1
has:1
is:1
openings:1
shoot:1
small:1
that:1
through:1
to:1
which:1

这题我开始用的是vector,因为用习惯了,我知道用map会更方便,因为map存储的顺序好像就是字符串的大小顺序,于是借这个机会我也学习一下map,把两个都写出来。

但是两者划分单词的方法都是一样的,要注意的几个问题:
1.我开始是直接用的cin>>s,接收每一个字符串,然后每次接收一个存一次,后来发现了一个问题就是当",and"就是符号和字母连在一起的情况。没办法只能一个字符一个字符的读取了
2.读取字符时按要求的字符划分成一个个单词,字符的拼接直接用+
3.注意大小写的转化(其实一般有大小写,就暗示着你要以字符为单位读取了)

vector

先上带码:

bool cmp(string a,string b){
    return a<b;
}
int main(){

    string s;
    vector<string> vec;

    getline(cin,s);
        int i=0;
        string str="";

        while(i<s.size()){
            if(s[i]==' '||s[i]=='.'||s[i]==','){
                if(str!=""){
                    vec.push_back(str);
                    str="";
                }
            }else{
                if(s[i]<='Z'&&s[i]>='A'){
                    s[i]=char(s[i]-'A'+'a');
                }
                str=str+s[i];
            }
            i++;
        }

    sort(vec.begin(),vec.end(),cmp);
    int j=0;
    while(j<vec.size()){
        int z=j+1;
        while(z<vec.size()&&vec[j]==vec[z]) z++;
        cout<<vec[j]<<':'<<z-j<<endl;
        j=z;
    }

}

1.把每个单词都存储下来,然后按字符串的顺序排序,sort加自定义的函数cmp
2.再读取,相同的单词计数

总的来说较麻烦

map

int main(){

    map<string ,int> m;
    map<string ,int>::iterator it;
    string s;
    getline(cin,s);
        int i=0;
        string str="";

        while(i<s.size()){
            if(s[i]==' '||s[i]=='.'||s[i]==','){
                if(str!=""){
                    m[str]++;
                    str="";
                }

            }else{
                if(s[i]<='Z'&&s[i]>='A'){
                    s[i]=char(s[i]-'A'+'a');
                }
                str=str+s[i];
            }
            i++;
        }
   for(it=m.begin();it!=m.end();it++){
        cout<<it->first<<":"<<it->second<<endl;
   }
}

1.定义一个map<string,int> m和一个迭代器map<string,int>::iterator it
2.这里赋值map[str]如果有就+1,没有的话就会自动生成一个键值对,初始化为0,然后还是可以+1
3.map的访问for(it=m.begin();it!=m.end();it++)
cout<first<<":"<second<<endl;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值