49. 字母异位词分组
中等
给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"], ["nat", "tan"], ["ate", "eat", "tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
解题思路
方法一:排序+哈希表
因为字母异位词的特点是 同为字母异位词的字符串所有的字母都相同,只是顺序不同。则按字母顺序后的字符串相同
- 1.把所有字符串按照字母顺序排序,则所有为一组的字母异位词的字符串是一样的
- 2.把排序后的字符串为键,把对应的没有排序的字符串作为值。则一个键下的值为以这个键的字符串中的字母组成的多个或一个字符串
- 把哈希表中的值:同组字母组成的字符串 放入 结果中
- 输出结果
c
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,vector<string>>str2;
//定义一个哈希表,键=按字母顺序排好序的字符串,值=同为异位词的字符串
for(string str:strs){
//遍历strs中的每一个字符串,把每次遍历的字符串放到str中
string tempstr=str;
//把字符串给到tempstr
sort(tempstr.begin(),tempstr.end());
//对当前遍历到的字符串排序,sort函数用来排序,范围是从tempstr的开始(begin)到tempstr的结束
str2[tempstr].push_back(str);
//在str2的哈希表中找键为排序后的tempstr的向量,如果没有找到则在哈希表中新建一个键为tempstr的元素,值为空的string向量。
//push_back把没有排序的str放入以tempstr为键的向量末尾做值
}
vector<vector<string>> res;
//输出结果,由输出示例可以看出 结果为 一组由字符串向量组成的向量,所以定义一个由字符串向量组成的向量变量 res
for(auto[_,strVec]:str2){
//auto表示这个向量的类型为auto,[_,strVec]表示一个键值对,_在键的位置,表示我们不关注键,strVec提取对应的值,遍历str2中的每一个键值对
res.push_back(strVec);
//strVec对应的是同为字母异位词的多个或一个字符串,把每一个strVec放到res结果向量的后面
}
return res;//返回结果向量
}
};
c
补充:
在C++中,for(string str:strs)表示遍历strs中的字符串
- for表示循环
- string str:定义了一个类型为string的str变量,用来存储每次遍历的字符串
- strs: 被遍历的字符串,在这里是传入参数的strs
push_back()是vetor中的成员函数,把传入的参数放到指定的向量后面
我原本自己的思路:
1.按顺序取strs中的没有访问过的字符串,新建一个哈希表,设置访问数组
2.把取出来的字符串的每个字母转成ASCII码值作为存储在哈希表中的下标,出现一次哈希表中+1
3.取strs中在这个字符串后面的字符串
4.遍历哈希表,当不等于1处,把下标转成ASCII看取的后面字符串中是否有这个字母
如果其中一处不等于1的字母没有,则break,找下一个字符串
如果所有不等于1的下标对应的字母都有,则把这个字符串跟一开始取出来的字符串放一起,把这个字符串的访问数组下标设为1
5.继续找下一个没有被访问过的字符串,重复4的操作,一直找到strs中的字符串结束
注意:
没有利用字母异位词的 同组字母相同的特点。
- 如果有 由相同元素组成的,可以先排序把他们变成相同的,再进行操作