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

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

  • 相关阅读:
    《Linux Device Drivers》第十二章 PCI司机——note
    Swift开放StatsD后上传数据的出现,出现退换货503的Bug
    google login page
    Use GraceNote SDK in iOS(一)通过序列化GDO查询专辑封面
    【人在职场】能力与价值
    HDU 5067-Harry And Dig Machine(DFS)
    LeetCode:Merge Two Sorted Lists
    HTML5硕士学习笔记
    通过设置注册表隐藏桌面图标
    SharePoint 要一个多行文本类型字段为特殊类型的链接
  • 原文地址:https://www.cnblogs.com/xwww666666/p/15907032.html
Copyright © 2020-2023  润新知