Group Anagrams
Given an array of strings, group anagrams together.
Example:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
Note:
- All inputs will be in lowercase.
- The order of your output does not matter.
题意:已知一组字符串,将所有由颠倒的字母顺序构成的字放到一起输出。
算法思路:
方法一:
哈希表以内部进行排序的各个单词为key
,以字符串向量为value
,存储各个字符数量相同的字符串。
- 设置字符串到字符串向量的哈希表
anagram
,便利字符串向量strs
中的单词strs[i]
:- 设置临时变量
str = strs[i]
,对str
进行排序。 - 若
str
未出现在anagram
中,设置str
到一个空字符串向量的映射。 - 将
str[i]
添加至字符串向量anagram[str]
中。
- 设置临时变量
- 遍历哈希表
anagram
,将全部key
对应的value
push
进最终结果中。
class Solution{
public:
std::vector<std::vector<std::string>> groupAnagrams(
std::vector<std::string>& strs){
std::map<std::string, std::vector<std::string>> anagram;
std::vector<std::vector<std::string>> result;
for(int i = 0; i < strs.size(); i++){
std::string str = strs[i];
std::sort(str.begin(), str.end());
if(anagram.find(str) == anagram.end()){
std::vector<std::string> item;
anagram[str] = item;
}
anagram[str].push_back((strs[i]));
}
std::map<std::string, std::vector<std::string>> :: iterator it;
for(it = anagram.begin(); it != anagram.end(); it++){
result.push_back((*it).second);
}
return result;
}
};
方法二:
哈希表以26个字母的字符数量为key
,以字符串向量为value
,存储各个字符数量相同的字符串。
- 设置
vector
到字符串向量的哈希表anagram
,遍历字符串向量strs
中的单词trs[i]
:- 统计
strs[i
]中的各个字符数量,存储至vec
。 - 若
vec
未出现子啊anagram
中,设置一个vec
到一个空字符串向量的映射。 - 将
strs[i]
添加到字符串向量anagram[vec]
中。
- 统计
- 便利哈希表
anagram
,将全部key
对应的value
push
进最终的结果中。
void change_to_vector(std::string &str, std::vector<int> &vec){
for(int i = 0; i < 26; i++) {
vec.push_back(0);
}
for(int i = 0; i < str.length(); i++) {
vec[str[i] - 'a']++;
}
}
class Solution{
public:
std::vector<std::vector<std::string>> groupAnagrams(
std::vector<std::string>& strs){
std::map<std::vector<int>, std::vector<std::string>> anagram;
std::vector<std::vector<std::string>> result;
for(int i = 0; i < strs.size(); i++){
std::vector<int> vec;
change_to_vector(strs[i], vec);
if(anagram.find(vec) == anagram.end()){
std::vector<std::string> item;
anagram[vec] = item;
}
anagram[vec].push_back(strs[i]);
}
std::map<std::vector<int>, std::vector<std::string>> :: iterator it;
for(it = anagram.begin(); it != anagram.end(); it++){
result.push_back((*it).second);
}
return result;
}
};