【刷题】【stl】【字符串】反片语
2022/2/18 6:12:58
本文主要是介绍【刷题】【stl】【字符串】反片语,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题面:
输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典进行排序(所有大写字母在所有小写字母的前面)。
【样例输入】:
ladder came tape soon leader acme RIDE lone Dreis peat
ScAlE orb eye Rides dealer NotE derail LaCeS drIed
noel dire Disk mace Rob dries
#
【样例输出】:
Disk
NotE
derail
drIed
eye
ladder
soon
利用stl里面的map或者set进行计数,但是需要标准化每一个字符串
当标准后的字符一样时,两个字符就算作不满足条件
先用set写了一版
//决定使用map,map <string,int> cnt cnt[标准化后的字符串]++ //最后序号遍历,并且按照字典序输出,符合条件的字符串 #include<bits/stdc++.h> using namespace std; vector <string > words; vector <string > d_words; vector <string > ans; multiset <string > st; //要用可重复集合 int cnt[26]; string work(string s0)//对字符串进行处理 { int len=s0.length(); memset(cnt,0,sizeof(cnt)); for(int i=0;i<len;i++) if(s0[i]>='A' && s0[i]<='Z' ) cnt[s0[i]-'A']++; else if(s0[i]>='a' && s0[i]<='z' ) cnt[s0[i]-'a']++; string s1=""; for(int i=0;i<26;i++) for(int j=0;j<cnt[i];j++) s1+=(char)('a'+i ) ; return s1; } int main() { string s; while(cin>>s ) { if(s[0]=='#' ) break; words.push_back(s); d_words.push_back(work(s)); } int n=words.size(); for(int i=0;i<n;i++) st.insert(d_words[i]); for(int i=0;i<n;i++) // { // cout<<d_words[i]<<endl; if(st.count(d_words[i])==1 ) ans.push_back(words[i] ); // } sort(ans.begin(),ans.end()); vector <string >::iterator it; for(it=ans.begin();it!=ans.end();it++) cout<<*it<<endl; return 0; }
然后试了试map
//决定使用map,map <string,int> cnt cnt[标准化后的字符串]++ //最后序号遍历,并且按照字典序输出,符合条件的字符串 #include<bits/stdc++.h> using namespace std; vector <string > words; vector <string > d_words; vector <string > ans; map <string ,int > mp_cnt; int cnt[26]; string work(string s0)//对字符串进行处理 { int len=s0.length(); memset(cnt,0,sizeof(cnt)); for(int i=0;i<len;i++) if(s0[i]>='A' && s0[i]<='Z' ) cnt[s0[i]-'A']++; else if(s0[i]>='a' && s0[i]<='z' ) cnt[s0[i]-'a']++; string s1=""; for(int i=0;i<26;i++) for(int j=0;j<cnt[i];j++) s1+=(char)('a'+i ) ; return s1; } int main() { string s; while(cin>>s ) { if(s[0]=='#' ) break; words.push_back(s); d_words.push_back(work(s)); } int n=words.size(); for(int i=0;i<n;i++) mp_cnt[ d_words[i] ]++; for(int i=0;i<n;i++) // { // cout<<d_words[i]<<endl; if(mp_cnt[ d_words[i] ] ==1 ) ans.push_back(words[i] ); // } sort(ans.begin(),ans.end()); vector <string >::iterator it; for(it=ans.begin();it!=ans.end();it++) cout<<*it<<endl; return 0; }
写起来区别不大,但因为没有大样例,以后再测下两种的速度区别
这篇关于【刷题】【stl】【字符串】反片语的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南