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