1071 Speech Patterns 需再做
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1071 Speech Patterns 需再做相关的知识,希望对你有一定的参考价值。
1. alphanumerical 的意思是字母数字混合编制的,也就是一句话中被认为是“单词”的组成成分的有数字和字母。这也是为什么例句中can1不被认为是can。
由于这道题对大小写不敏感,不妨在读入后,把大写字母全部改成小写
//大写换小写
for(int i=0;i<len;i++){
if(sen[i]>='A'&&sen[i]<='Z')sen[i] += 32;
}
封装一个函数判断单词是否是合法的,即在[a,z]和[0,9]范围内
bool isValid(char c){
if(c>='a'&&c<='z')return true;
if(c>='0'&&c<='9')return true;
return false;
}
2. 知道了单词的组成,本题的关键是如何分词,怎样在句子中取出单词呢?用一个指针变量i,令其小于句子的长度,读到第一个合法字符是开始加入单词,一直到读到第一个非法字符结束,重复这个过程。读到非法字符时不断更新i,直至读到下一个合法字符。
int i = 0;
string word;
while(i<len){
while(i<len&&isValid(sen[i])){
word += sen[i];
i++;
}
if(word.length()){
if(!mp[word])mp[word] = 1;//原先没有这个单词
else mp[word]++;
}
word.clear();//清空字符串
while(i<len&&!isValid(sen[i]))i++;//跳过无效的字符
}
3. 注意单词要判空。
4. 并不需要一个集合来存放单词,map本身就有迭代器。
AC代码
#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
bool isValid(char c){
if(c>='a'&&c<='z')return true;
if(c>='0'&&c<='9')return true;
return false;
}
int main(){
map<string,int> mp;
string sen;
getline(cin,sen);
int len = sen.length();
//大写换小写
for(int i=0;i<len;i++){
if(sen[i]>='A'&&sen[i]<='Z')sen[i] += 32;
}
int i = 0;
string word;
while(i<len){
while(i<len&&isValid(sen[i])){
word += sen[i];
i++;
}
if(word.length()){
if(!mp[word])mp[word] = 1;//原先没有这个单词
else mp[word]++;
}
word.clear();//清空字符串
while(i<len&&!isValid(sen[i]))i++;//跳过无效的字符
}
map<string,int>::iterator it;
int count = 0;
string str;
for(it=mp.begin();it!=mp.end();it++){
if(it->second>count){
count = it->second;
str = it->first;
}
}
cout<<str<<" "<<count<<endl;
return 0;
}
以上是关于1071 Speech Patterns 需再做的主要内容,如果未能解决你的问题,请参考以下文章