leetcode 49.字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
思路:
法1:对每个单词都进行排序,排序相同的放在同一个vector容器中,“键”为排序好的字符串,“值”为vector容器。
法2:对每个单词,用个矢量记录每个字母出现的次数,依次为key值,建立映射。
代码:
法1:
1 class Solution 2 { 3 public: 4 vector<vector<string>> groupAnagrams(vector<string>& strs) { 5 map<string, vector<string>> anagram; 6 //内部进行排序的各个单词为key,以字符串向量vector<string>为value,存储各个字符数量相同的字符串(anagram:变位词) 7 vector<vector<string>> result; 8 for (int i = 0; i < strs.size(); i++) { //遍历每个单词 9 string str = strs[i]; 10 sort(str.begin(), str.end()); //对str进行内部排序 11 if (anagram.find(str) == anagram.end()) {//若无法在哈希表中找到str(新的一个排序好的字符串) 12 vector<string> item; //设置一个空字符串向量 13 anagram[str] = item; //以排序后的strs[i]作为key 14 } 15 anagram[str].push_back(strs[i]); //在对应的字符向量中push结果 16 } 17 map < string,vector<string >> ::iterator it; 18 for (it = anagram.begin(); it != anagram.end(); it++) { 19 result.push_back(it->second); 20 } 21 return result; 22 } 23 };
法2:
1 void change_to_vector(string& str,vector<int> &vec) { 2 for (int i = 0; i < 26; i++) { 3 vec.push_back(0); 4 } 5 for (int i = 0; i < str.length(); i++) { 6 vec[str[i] - 'a']++; 7 } 8 } 9 10 class Solution 11 { 12 public: 13 vector<vector<string>> groupAnagrams(vector<string> &strs){ 14 map<vector<int>, vector<string>> anagram; 15 vector<vector<string>> result; 16 for (int i = 0; i < strs.size(); i++) { 17 vector<int> vec ; 18 change_to_vector(strs[i], vec); 19 if (anagram.find(vec) == anagram.end()) { 20 vector<string> item; 21 anagram[vec] = item; 22 } 23 anagram[vec].push_back(strs[i]); 24 } 25 map<vector<int>, vector<string>>::iterator it; 26 for(it = anagram.begin(); it != anagram.end(); it++) { 27 result.push_back(it->second); 28 } 29 return result; 30 } 31 };

浙公网安备 33010602011771号