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=; 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()>)
{
while(!vec.empty())
{
res.push_back(vec[vec.size()-]);
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;
}