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