49.Group Anagrams同字符词语分组
1 描述
Given an array of strings, group anagrams together.
Example:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
2 思路
- 建立hash表,依次取数组中的值存入瞬时变量,然后对变量进行排序,最后将排序后的结果作为key值,原始结果作为value,最后将同一个key值得元素全部取出。
-
方法2对方法一中的key值做出了调整,采用26个字符转为key,具体如下
[a, b, c, d, e, …., t,…,z]
编码:[1, 0, 0, 0, 1,…, 1,…,0] => eat, tea, ate
[a, b, c, ..., n, …., t,…,z]
编码:[1, 0, 0,…, 1,…, 1,…,0] => tan, nat
3 C++
- 方法一
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> result;
map<string, vector<string>> anagram;
for(int i=0; i<strs.size(); i++) {
string str = strs[i];
sort(str.begin(), str.end());
if(anagram.find(str) == anagram.end()) {
vector<string> item;
anagram[str] = item;
}
anagram[str].push_back(strs[i]);
}
map<string, vector<string>>::iterator it;
for(it = anagram.begin(); it != anagram.end(); it++) {
result.push_back((*it).second);
}
return result;
}
};
- 方法二
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> result;
map<vector<int>, vector<string>> anagram;
for(int i=0; i<strs.size(); i++) {
vector<int> vec;
str_to_vector(strs[i], vec);
if(anagram.find(vec) == anagram.end()) {
vector<string> item;
anagram[vec] = item;
}
anagram[vec].push_back(strs[i]);
}
map<vector<int>, vector<string>>::iterator it;
for(it = anagram.begin(); it != anagram.end(); it++) {
result.push_back((*it).second);
}
return result;
}
private:
void str_to_vector(string &str, 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'] ++;
}
}
};
继续阅读
- 我的微信小程序
- 这是我的微信小程序扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-
评论