题目大意
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
解题思路
分析:由于所有输入仅为小写字母,因此准备一个长度为26的数组,用来记录每个字符串中不同字母出现的次数。遍历完当前字符串A后,数组记录了该字符串的字符信息,将该数组中的元素串成一个新字符串B(异位词生成的该字符串均相同),B作为map中的键,然后将字符串A放入B对应的value中。
注:由于数组仅统计词频,不考虑顺序,因此异位词的数组结构均相同。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
map<string, vector<string>>ans;
for (auto item : strs)
{
//统计当前字符串的词频
vector<int>graph(26, 0);
for (int i = 0; i < item.size(); i++)
++graph[item[i] - 'a'];
string sym = "";
//将当前字符串的词频串成一个唯一标识
for (int i = 0; i < graph.size(); i++)
sym += char(graph[i]) + '_';
ans[sym].push_back(item);
}
vector<vector<string>>fin;
for (auto item : ans)
fin.push_back(item.second);
return fin;
}
};