【刷题】【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;
} 

写起来区别不大,但因为没有大样例,以后再测下两种的速度区别

posted @ 2022-02-18 00:51  心若笺诗  阅读(29)  评论(0编辑  收藏  举报