代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
题目描述
输入若干行数据,每行只包含英文字符(不区分大小写)和数字字符,请找出所有的“单词”,这里所说的“单词”指的是长度大于等于3的连续英文字符构成的字符序列,并把找到的“单词”按字母序从大到小排列,若某个单词重复出现,在结果中只输出一次,若没有满足要求的单词,输出“no word"。
输入格式
第一行给出总行数n,接下来n行给出由英文字符(不区分大小写)和数字字符组成的串,每行中字符数量不超过1000,每行以回车结束。
输出格式
输出“单词”的降序序列,每个“单词”首字母大写,单词间用一个空格分隔,最后一个单词后没有空格。
输入样例
1
Hi1123hello2how98are2111119you88
2
Fine445thank66you
and990you276w
2
Fe445ak66
an990u276w
输出样例
You How Hello Are
You Thank Fine And
no word
个人思路
- 用c++的tolower()函数在开始时把所有的字符转换为小写字母
- 用stl中set()自动排序去重的特性存入所有的单词
- 用栈后进先出的特性对set中从小到大排序的数据逐个输出(这里主要是由于题目要求结尾不能有空格,迭代器不方便输出的缘故才另外加入了个stack)
- 输出时用toupper()即可对每个单词的首字母进行大写转换的处理
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
set<string> s;
cin>>n;
while(n--)
{
string str;
cin>>str;
int flag=0;
string temp="";
for(int i=0;i<str.length();i++)
{
if(str[i]<'0'||str[i]>'9')
{
str[i]=tolower(str[i]);
flag++;
temp+=str[i];
}
else
{
if(flag>=3)
{
s.insert(temp);
}
temp="";
flag=0;
}
}
}
stack<string> ss;
set<string>::iterator it;
for(it=s.begin();it!=s.end();it++)
{
ss.push(*it);
}
if(ss.empty())
{
cout<<"no word";
}
else
{
string temp=ss.top();
temp[0]=toupper(temp[0]);
cout<<temp;
ss.pop();
while(!ss.empty())
{
string temp=ss.top();
temp[0]=toupper(temp[0]);
cout<<" "<<temp;
ss.pop();
}
}
}