算法1:寻找字符串数组中指定字符出现的字符串并排序

请设计一个高效算法,再给定的字符串数组中,找到包含”Coder”的字符串(不区分大小写),并将其作为一个新的数组返回。结果字符串的顺序按照”Coder”出现的次数递减排列,若两个串中”Coder”出现的次数相同,则保持他们在原数组中的位置关系。
给定一个字符串数组A和它的大小n,请返回结果数组。保证原数组大小小于等于300,其中每个串的长度小于等于200。同时保证一定存在包含coder的字符串。
测试样例:[“i am a coder”,”Coder Coder”,”Code”],3
返回:[“Coder Coder”,”i am a coder”]

解题思路

首先我们找数组每一个元素中是否有“coder”字样出现,如果没有直接跳到下一个元素,如果有,我们则判断code字样后面剩余的字符串中是否还有coder字样,并且统计字符串中coder出现的次数,我们将出现coder的字符串和相应coder出现的次数合并在一起,存在pair类型中,加入到vector中,之后对vector元素利用sort进行排序,指定sort操作符重载函数即可。代码如下:

C++实现

    #include<iostream>  
    #include<string>  
    #include<vector>  
    #include<map>  
    #include<iterator>  
    #include<stdlib.h>  
    #include<algorithm>  
    using namespace std;  

    typedef pair<string, int> PAIR;  
    vector<string> findCoder(vector<string> A, int n);  
    bool cmp_by_value_less(const PAIR& l,const PAIR& r);    


    void main()  
    {  
        vector<string> A;  
        A.push_back("i am a coder");  
        A.push_back("Coder Coder");  
        A.push_back("Code");  
        vector<string> b=findCoder(A,3);  
    }  
    bool cmp_by_value_less(const PAIR& l,const PAIR& r)    
    {    
        return l.second<r.second;    
    }    

    vector<string> findCoder(vector<string> A, int n) {  
            size_t npos=-1;  
            vector<string> res;  
            if(A.size()!=n||A.size()<=0||n<=0) return res;  

            vector<PAIR> vec;  
            for(int i=0;i<n;i++)  
                {  
                string cur=A[i];  
            transform(cur.begin(), cur.end(), cur.begin(), toupper);//注释1  
                int found_num=0;  
                while(cur.length()>=5)  
                    {  
                    int found=cur.find("CODER");  
                    if(found==npos)//注释2 

                        break;  
                    else  
                        {  
                        found_num++;  
                        string temp(cur.begin()+found+5,cur.end());  
                        cur=temp;  
                    }  
                }  
                if(found_num>0)  
                    {  
                    PAIR ele(A[i],found_num);  
                    vec.push_back(ele);  
                }  
            }  
             sort(vec.begin(),vec.end(),cmp_by_value_less); //注释3  
            for(int i=0;i<vec.size();i++)  
                {  
                res.push_back(vec[i].first); 
            }  
            return res;  

        }  

注释

注释1:
transform函数的作用是:将某操作应用于指定范围的每个元素。transform函数有两个重载版本:
transform(first,last,result,op);//first是容器的首迭代器,last为容器的末迭代器,result为存放结果的容器,op为要进行操作的一元函数对象或sturct、class。
因为string没有提供直接转换大小写的函数,只有通过char的转换大小写的toupper和STL的stransform来实现。
注释2:
npos是一个常数,用来表示不存在的位置,类型一般是std::container_type::size_type
npos表示string的结束位子,是string::type_size 类型的,也就是find()返回的类型,但是要记得生明哦!
注释3:

template <class RandomAccessIterator, class Compare>    
  void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

我们定义comp比较函数即可比较vector中的元素

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值