【挑单词 (20 分)】天梯赛训练题,解析,C++实现,代码明了

7-3 挑单词 (20 分)

7-3 挑单词 (20 分)
输入若干行数据,每行只包含英文字符(不区分大小写)和数字字符,请找出所有的“单词”,这里所说的“单词”指的是长度大于等于3的连续英文字符构成的字符序列,并把找到的“单词”按字母序从大到小排列,若某个单词重复出现,在结果中只输出一次,若没有满足要求的单词,输出“no word"。

输入格式:
第一行给出总行数n,接下来n行给出由英文字符(不区分大小写)和数字字符组成的串,每行中字符数量不超过1000,每行以回车结束。

输出格式:
输出“单词”的降序序列,每个“单词”首字母大写,单词间用一个空格分隔,最后一个单词后没有空格。

输入样例1:
在这里给出一组输入。例如:

1
Hi1123hello2how98are2111119you88
输出样例1:
在这里给出相应的输出。例如:

You How Hello Are
输入样例2:
在这里给出一组输入。例如:

2
Fine445thank66you
and990you276w
输出样例2:
在这里给出相应的输出。例如:

You Thank Fine And
输入样例3:
在这里给出一组输入。例如:

2
Fe445ak66
an990u276w
输出样例3:
在这里给出相应的输出。例如:

no word

这里我会做一个视频在后面,可以看视频讲解
如果看源码觉得能看懂的话,就直接看源码吧

#include
#include
#include
#include
#include
#include
using namespace std;

int main(){
	vector<string> vec;
	
	int n;
	
	cin>>n;
	
	string str[n];
	
	int flag;
	for(int r = 0;r < n; r++){
		
		cin>>str[r];
			
		for(int i=0;i<str[r].length();i++){
			
			if((str[r].at(i)<='z'&&str[r].at(i)>='a')||(str[r].at(i)>='A'&&str[r].at(i)<='Z')){ //有地方用i 有地方用j 小心点 
				
				stringstream ss;
//				cout<<"str[r].at(j):"<
				ss<<str[r].at(i);
				int flag = 0;
				for(int j=i+1;j<str[r].length();j++){
					flag = j;
					if((str[r].at(j)<='z'&&str[r].at(j)>='a')||(str[r].at(j)>='A'&&str[r].at(j)<='Z')){
						ss<<str[r].at(j);
//						cout<<"str[r].at(j):"<
					}else break;
					
				}
				
				if(flag-i >= 3){
					string s;
					ss>>s;
					vec.push_back(s);
					i=flag;
				}
				
				
			}
			
		}
//		cout<
		
	}
	
	// 排序 给vector 从大到小 ,然后还得删除重复元素 
	
	
	
	if(vec.empty()){
		cout<<"no word"<<endl;
	}
	else{
		
		
			vector<string>::iterator is;
	for(is=vec.begin();is!=vec.end();is++){
		string x = *is;
		if(x.at(0)<='Z'&&x.at(0)>='A'){
				
			x.at(0)+=32;
			vec.erase(is);
			vec.push_back(x);		
			
		}
		
		
	}
	
	

	sort(vec.begin(), vec.end());
	vector<string>::iterator ite = unique(vec.begin(), vec.end());
	vec.erase(ite, vec.end());
	
	vector<string>::iterator it;
	for(it=vec.end()-1;it!=vec.begin()-1;it--){
		string a = *it;
		for(int j=0;j<a.length();j++){
			if(j==0){
				char c =(char)a.at(j) - 32;
				cout<<c;
			}else cout<<a.at(j);
		}
		
		if(it!=vec.begin())
		cout<<" ";
	}
	}
	


}

你可能感兴趣的:(类,c++,数据结构)