【刷题】【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; }
写起来区别不大,但因为没有大样例,以后再测下两种的速度区别