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;
}
View Code

 

posted @ 2017-02-12 11:51  辰曦~文若  阅读(264)  评论(0编辑  收藏  举报