PAT甲题题解-1071. Speech Patterns (25)-找出现最多的单词
分割字符串的用法+map映射
给出input中出现次数最多的单词,如果次数相同,给出按字典序最小的。
这里我用了自定义分隔符来读取字符串,方法如下:
//按照定义的分隔符d来分割字符串,对str进行读取 const char *d = "\n\'\"\? ";//换行,',",?,空格 char *p; p = strtok(str,d); //这样做的主要原因是避免最后输出换行 while(p) { //对p进行处理 p=strtok(NULL,d); //读取下一个p }
AC代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <map> using namespace std; /* 分割字符串的用法+map映射 给出input中出现次数最多的单词,如果次数相同,给出按字典序最小的。 */ const int maxn=1048576+5; char str[maxn]; char words[maxn]; map<string,int> maps; int main() { gets(str); int len=strlen(str); //多加了一些非字母数字的符号,样例才全部过 const char *d = "\n\'\"\? :!,.~`%$#*^&()-+<>[]"; char *p; p = strtok(str,d); int ans=0; string ss,answords; while(p) { sprintf(words,"%s",p); //printf("%s\n",words); p=strtok(NULL,d); int wordslen=strlen(words); for(int i=0;i<wordslen;i++){ words[i]=tolower(words[i]);//转小写 } ss=words; maps[ss]++; if(maps[ss]>ans){ ans=maps[ss]; answords=ss; } else if(maps[ss]==ans && ss.compare(answords)<0){ ans=maps[ss]; answords=ss; } } cout<<answords<<" "<<ans<<endl; return 0; }