LeetCode 49:字母异位词分组
题目描述
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
解题
简单逻辑:一个新词首先判断当前输出二维数组中是否有其同母异位词,如果有将其放在同一个一维数组中,否则放在一个新的一维数组里。因此需要完成两个工作,同母异位词的判定和字符串到索引的映射。字符串到索引的映射可以借助哈希表完成,判断两个字符串是否是同母异位词可以借助排序后的字符串是否相同。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
sort(strs.begin(), strs.end());
unordered_map<string, int> dict;
vector<vector<string>> result;
for (auto s : strs){
string s_copy(s);
sort(s_copy.begin(), s_copy.end());
if (dict.find(s_copy) == dict.end()){
dict[s_copy] = result.size();
result.emplace_back(vector<string>(1,s));
}
else
result[dict[s_copy]].emplace_back(s);
}
return result;
}
};
如果两个字符串所包含的字符的统计数目完全一致,那么这两个字符串就是同母异位词。因此可以先统计字符串中各个字符出现的数目,为了方便建立到索引的映射关系,可以将26个小写字母的统计数目转化为一个字符串,然后建立字符串到索引的映射。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
sort(strs.begin(), strs.end());
unordered_map<string, int> dict;
vector<vector<string>> result;
vector<int> hist(26, 0);
for (auto &s : strs){
for (auto &c : s){
++hist[c-'a'];
}
string temp_str;
for (auto &i : hist){
temp_str += to_string(i);
}
if (dict.find(temp_str) == dict.end()){
dict[temp_str] = result.size();
result.emplace_back(vector<string> {s});
}
else{
result[dict[temp_str]].emplace_back(s);
}
hist.assign(26, 0);
}
return result;
}
};