利用map进行字符串处理。
附第一次写的代码
#include <bits/stdc++.h>
using namespace std;
bool check(char ch){
if(ch >= 'a' && ch <= 'z') return 1;
if(ch >= 'A' && ch <= 'Z') return 1;
if(ch >= '0' && ch <= '9') return 1;
return 0;
}
int main(){
string s;
getline(cin, s);
map<string, int> mp;
int i = 0;
int l = s.length();
string word = "";
for(i = 0; i < l-1; i ++){
if(check(s[i])){
if(s[i] >= 'A' && s[i] <= 'Z') s[i] += 32;
word += s[i];
if(!check(s[i+1])){
mp[word] ++;
word = "";
}
}
}
if(check(s[i])){
word += s[i];
mp[word] ++;
}
string key;
int value = 0;
map<string, int>::iterator it;
for(it = mp.begin(); it != mp.end(); it ++){
if(it->second > value){
key = it->first;
value = it->second;
}
}
printf("%s %d\n", key.c_str(), value);
return 0;
}
第二次写的代码
#include <iostream>
#include <map>
#include <ctype.h>
using namespace std;
int main(){
string s, word;
getline(cin, s);
map<string, int> mp;
int l = s.length();
for(int i = 0; i < l; i ++){
word = "";
while(i < l && isalnum(s[i])){
word += tolower(s[i]);
i ++;
}
if(word == "") continue;
mp[word] ++;
}
string key;
int value = 0;
map<string, int>::iterator it;
for(it = mp.begin(); it != mp.end(); it ++){
if(it->second > value){
key = it->first;
value = it->second;
}
}
printf("%s %d\n", key.c_str(), value);
return 0;
}
利用isalnum()函数可以少写一个check函数,将大写字母转化为小写字母时,可以先判断是否为大写字母再加32,或者直接用tolower()函数。
第一次写的时候最后一个测试点WA了,是没有将句尾的最后一个字母存进word。
第二次写,在循环里面,如果不是数字/字母,直接++,直到一个word结束,这样判断方便很多。
map<string, int>中,string是按字典序排序的,int默认为0.所以其实可以不写find判断,直接++。