leedcode——49. Group Anagram题解
- 获取链接
- X
- 电子邮件
- 其他应用
题目要求:
Given an array of strings strs, group the anagrams together. You can return the answer in any order.
An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
Example 1:
Input: strs = ["eat","tea","tan","ate","nat","bat"] Output: [["bat"],["nat","tan"],["ate","eat","tea"]]
Example 2:
Input: strs = [""] Output: [[""]]
Example 3:
Input: strs = ["a"] Output: [["a"]]
Constraints:
1 <= strs.length <= 1040 <= strs[i].length <= 100strs[i]consists of lowercase English letters.
解法:
vector<vector<string>> groupAnagrams(vector<string>& strs) { unordered_map<string, vector<string>> anagramGroups; for (const string& str : strs) { string sortedStr = str; sort(sortedStr.begin(), sortedStr.end()); anagramGroups[sortedStr].push_back(str); } vector<vector<string>> result; for (auto it = anagramGroups.begin(); it != anagramGroups.end(); ++it) { result.push_back(it->second); } return result;}
it->second是什么意思
在C++中,
it->second是一个用于访问unordered_map中键值对的语法。在这个例子中,it是一个指向unordered_map中元素的迭代器,it->second表示当前迭代器指向的键值对中的值部分。在这个特定的情况下,anagramGroups是一个unordered_map,它的键是经过排序后的字符串,值是原始的字符串列表。所以当我们遍历anagramGroups时,it->second表示当前排序后字符串对应的原始字符串列表。
for (const string& str : strs)中为什么要用const和&
const修饰变量表示该变量是不可修改的,即它的值在声明后不能被修改。而使用&表示引用,它允许我们通过引用来操作原始数据,而不是创建数据的副本,这样可以提高程序的效率。在for (const string& str : strs)这个语句中,const string&表示我们遍历strs数组时,每个元素都是一个不可修改的字符串引用。这样做有两个好处:
- 使用
const确保了在循环中不会意外地修改字符串的值,从而提高了代码的安全性。 - 使用引用
&避免了在循环中复制字符串,提高了性能,尤其是当处理大量字符串时。
因此,for (const string& str : strs)这个语句可以保证安全地遍历字符串数组,并且在性能上有一定的优势。
++it 和 it++ 有什么区别
++it 和 it++ 都会增加迭代器 it 的值。它们之间的主要区别在于返回值和效率上。返回值:
++it(前置递增)会先递增it的值,然后返回递增后的迭代器。it++(后置递增)会先返回当前的it,然后再将it的值递增。
效率:
++it通常比it++更高效。因为++it只需要递增迭代器的值,而it++还需要创建并返回it的副本,然后再递增原始迭代器的值。
在大多数情况下,这两者的区别并不会对代码的功能产生影响,但在某些特定情况下,例如在循环中对大型数据结构进行迭代时,前置递增操作 ++it 通常会更高效,因为它不需要创建副本。
for (auto it = anagramGroups.begin(); it != anagramGroups.end(); ++it) {
result.push_back(it->second);
}
为什么这里不用&
it来遍历anagramGroups中的每一个键值对。在C++中,迭代器是一种对象,它本身就代表了容器中的某个元素,而不是指向该元素的指针。在循环中,it是一个迭代器对象,它按值传递给result.push_back()函数。因为我们只需要访问it->second,而不需要修改迭代器本身,所以不需要使用引用&来传递迭代器。
如果我们希望在循环中修改迭代器本身(例如,将迭代器向前移动),那么我们就需要使用引用&来传递迭代器,类似于for (auto& it = anagramGroups.begin(); it != anagramGroups.end(); ++it)。但在这个例子中,并没有对迭代器本身进行修改操作,因此不需要使用引用。
- 获取链接
- X
- 电子邮件
- 其他应用


