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;
}