C++~LeetCode49. 字母异位词分组-思路-逐行注释

题目:

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:

输入: strs = [""]
输出: [[""]]
示例 3:

输入: strs = ["a"]
输出: [["a"]]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/group-anagrams


思路

        将字母出现的频次作为键,map>,这里的string表示的是字母出现的频数,string hash= string(26,0),初始化字符串hash,26个字符,分别表示a-z出现的次数。

        然后将每个字符串中字符的出现次数统计一下,以当前统计字母出现次数的字符串作为键,将当前字符串插入到hashMap中键所对应的vector里面。

        最后将hashMap里面的内容存放到ans里面就可以了。在遍历的时候使用了auto,每次获取的是map中的元素,也就是pair(pair是一个含有两个数据的数据组,可以看作结构体: struct pair { Mytype first: Mytype second; }; 其中Mytype是用户自己设置的数据类型),所以这里的vec.second实际上就是map键值对中的值,也就是string类型的vector。


代码

class Solution {
public:
	vector> groupAnagrams(vector& strs) {
		vector> ans;  //存放anwser
		unordered_map> hashMap;  //键值对,键存放的是当前字符串每个字符出现的次数,值存放的是字符出现次数与键相同的字符串vector
		for (auto str : strs) {  //auto遍历字符串数组,得到每一个字符串
			string hash = string(26, 0);  //hash表示当前字符串中26个字母每个字母出现的次数
			for (auto c : str) {  //遍历一个字符串
				hash[c-'a']++;  //让每个字符出现的次数+1
			}
			hashMap[hash].emplace_back(str);  //将当前字符串每个字符出现的次数结果作为键,在其对应的值,也就是string类型的vector容器里面加入当前字符串
		}
		for (auto vec : hashMap) {  //遍历hashmap
			ans.emplace_back(vec.second);  //将结果放到ans中,注意vec是hashmap中的一个键值对,second表示当前键值对的值,也就是一个string类型的vector
		}
		return ans;
	}
};

设strs的长度为n,strs中最长字符串的长度为s,可能出现的字符数量为a(就是26)

则时间复杂度为O(n(a+s)),空间复杂度为O(n(a+s))

你可能感兴趣的:(LeetCode,C++,c++,哈希算法,leetcode,开发语言,算法)