leetcode:字符串之Anagrams
题目:
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
For example,
Input: ["tea","and","ate","eat","den"]
Output: ["tea","ate","eat"]
即:找出符合回文构词法的词。
Anagram(回文构词法)是指打乱字母顺序从而得到新的单词,比如"dormitory" 打乱字母顺序会变成"dirty room" ,"tea" 会变成"eat"。
回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序。因此,将几个单词按照字母顺序排序后,若它们相等,则它们属于同一组anagrams 。
C++实现;
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
vector<string> anagrams(vector<string> &strs)
{
unordered_map<string, vector<string> > group;
for (const auto &s : strs)
{
string key = s;
sort(key.begin(), key.end());
group[key].push_back(s);
}
vector<string> result;
for (auto it = group.cbegin(); it != group.cend(); it++)
{
if (it->second.size() > 1)
result.insert(result.end(), it->second.begin(), it->second.end());
}
return result;
}
int main()
{
string word[]={"tea","and","ate","eat","den"};
size_t s_count=sizeof(word)/sizeof(string);
vector<string> svec(word,word+s_count);
vector<string>::iterator it;
for(it=svec.begin();it!=svec.end();it++)
cout<<*it<<" ";
cout<<endl;
vector<string> re_svec;
re_svec=anagrams(svec);
vector<string>::iterator it1;
for(it1=re_svec.begin();it1!=re_svec.end();it1++)
cout<<*it1<<" ";
cout<<endl;
return 0;
}
测试结果;