pat1071

来源:互联网 发布:mac怎么玩魔兽世界 编辑:程序博客网 时间:2024/06/05 05:37

字符串的题是我的弱项,因为我觉得我好像对数字感兴趣,其实这只是借口。

本题我在11月2号的时候只拿到了17分,已经忘了是怎么写的,早上做了半小时过了,我觉得让你在一串字符串中统计单词的问题需要注意三点:

1开始的时候需要注意单词的开始可能不是在这串东西的第0个位置,可能一开始带有几个空格或者其他非法字符,不过这只是可能,具体也要看题。我的处理的方法是到第一个合法字符开始统计

2中间可能有多个空格和非法字符,很多人觉得如果当前字符是非法的,开始把前面一段的字符定为一个单词,那么这样有一个问题 ,我连续两个非法的字符 ,会把空字符串也当做一个单词,我处理的方法是,碰到非法单词时,我在看看当前已经遍历到的串是否为空,若为空,那么说明是连续的非法字符,否则是一个新的单词

3结尾的时候可能会有字符没有被统计,比如结尾的时候是一个合法的字符,而我们的程序是碰到一个非法字符统计一次,那么最后那个单词时没有被统计过的,我的处理方法 是,循环结束后,再看看刚才保存遍历字符串是否为空,非空则再统计一次。

附代码如下:

#include<stdio.h>#include<iostream>#include<map>#include<string.h>#include<string>using namespace std;char c[1048577];map<string,int >cl;map<string,int >::iterator it;int check(int i){    if(c[i]>='a'&&c[i]<='z')        return 1;    if(c[i]>='A'&&c[i]<='Z')        return 1;    if(c[i]>='0'&&c[i]<='9')        return 1;    return 0;}int main(){    gets(c);    int i,j;    for(i=0;c[i];i++)    if(c[i]>='A'&&c[i]<='Z')    c[i]+=32;    for(i=0;c[i];i++)    if(check(i))        break;    string cc="";    int flag=0;    for(j=i;c[j];j++)    {        if(check(j))            cc+=c[j];        else        {            if(cc!="")            {                cl[cc]++;                cc="";            }        }    }    if(cc!="")        cl[cc]++;    int max=0;    string ans;    for(it=cl.begin();it!=cl.end();it++)    {        if(max<(*it).second)        {            max=(*it).second;            ans=(*it).first;        }    }    cout<<ans<<" "<<max<<endl;}


0 0
原创粉丝点击