PAT甲题题解-1071. Speech Patterns (25)-找出现最多的单词

时间:2023-03-08 22:10:35

分割字符串的用法+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=+;
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=;
string ss,answords;
while(p)
{
sprintf(words,"%s",p);
//printf("%s\n",words);
p=strtok(NULL,d);
int wordslen=strlen(words);
for(int i=;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)<){
ans=maps[ss];
answords=ss;
}
}
cout<<answords<<" "<<ans<<endl;
return ;
}