问题描述:
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
注:需要说明一点,输出的字符串顺序,没有要求。但是测试的时候,由于答案只给出了一种,所以,会提示错误。只要自己的结果分词正确,提交即可。
执行结果:
代码描述:
思路:将原来的字符串 strs ,复制一份副本 temp 出来,然后对副本temp 内的每个字符串进行排序,这样字母异位词就一致了,然后对副本temp进行map操作,map的键为字符串,值为vector<string>, 将temp中对应的strs的词(相同索引位置),push_back进vector中。然后再取出vector中的词,加入vector<vector<string>> res 中。
时间复杂度O(n), 空间复杂度O(n)。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string> > res;
if(strs.size() == 0) return res;
if(strs.size() == 1)
{
vector<string> temp;
temp.push_back(strs[0]);
res.push_back(temp);
return res;
}
vector<string> temp(strs.begin(), strs.end());
for(int i = 0; i < temp.size(); ++i)
{
sort(temp[i].begin(), temp[i].end());
}
map<string, vector<string>> m;
for(int i = 0; i < strs.size(); ++i)
{
if(m.count(temp[i]) > 0)
{
m[temp[i]].push_back(strs[i]);
}
else
{
m[temp[i]].push_back(strs[i]);
}
}
map<string, vector<string>>::iterator it = m.begin();
for(; it != m.end(); ++it)
{
res.push_back(it->second);
}
return res;
}
};