careercup-排序和查找 11.2

11.2 编写一个方法,对字符串数组进行排序,将所有变位词1排在相邻的位置。

类似leetcode:Anagrams

解法:

变位词:由变换某个词或短语的字母顺序构成的新的词或短语。例如,“triangle”是“integral”的变位词。

此题有个要求,对数组中的字符串进行分组,将变位词排在一起。注意,除此之外,并没有要求这些词按特定顺序排列。

做法之一就是套用一种标准排序算法,比如归并排序或快速排序,并修改比较器。这个比较器用来指示两个字符串互为变位词就是相等的。

检查两个词是否为变位词,最简单的方法是什么呢?我们可以数一数每个字符串中各个字符出现的次数,两者相同则返回true。或者,直接对字符串进行排序,若两个字符串互为变位词,排序后就相同。

 

C++实现代码:

#include<vector>

#include<unordered_map>

#include<algorithm>

#include<string>

#include<iostream>

using namespace std;



vector<string> anagrams(vector<string> &strs)

{

    vector<string> res;

    unordered_map<string,vector<string> > mp;

    string tmp;

    size_t i;

    for(i=0; i<strs.size(); i++)

    {

        tmp=strs[i];

        sort(tmp.begin(),tmp.end());

        mp[tmp].push_back(strs[i]);

    }

    auto mp_it=mp.begin();

    while(mp_it!=mp.end())

    {

        vector<string> vec=mp_it->second;

        if(vec.size()>1)

        {

            while(!vec.empty())

            {

                res.push_back(vec[vec.size()-1]);

                vec.pop_back();

            }

        }

        mp_it++;

    }

    return res;

}



int main()

{

    vector<string> vec= {"race","acre","ecra","sort","orts","ac","ca"};

    vector<string> result=anagrams(vec);

    for(auto a:result)

        cout<<a<<endl;

}

 

你可能感兴趣的:(UP)