本文最后更新于381 天前,其中的信息可能已经过时,如有错误请发送邮件到2278221697@qq.com
题目很简单:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,”tan”],[“ate”,”eat”,”tea”]]
解释:
- 在 strs 中没有字符串可以通过重新排列来形成
"bat"。 - 字符串
"nat"和"tan"是字母异位词,因为它们可以重新排列以形成彼此。 - 字符串
"ate","eat"和"tea"是字母异位词,因为它们可以重新排列以形成彼此。
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]
提示:
1 <= strs.length <= 1040 <= strs[i].length <= 100strs[i]仅包含小写字母
解题思路:
这题思路非常明确,对于每个字串,只需要考虑字母组成不需要考虑其位置。那我的思路就是:设置一个26小写字母的计数器,对于每个字符进行计数,最后根据小写字母的顺序将每个字母的个数拼接成字符串。将拼接好的字符串用map结构接收,作为key,而value是具有该编码的字符串集,最后合并结果集即可。直接上代码:
class Solution {
public:
string countChar(string str) {
map<char, int> maps;
for (char i = 'a'; i <= 'z'; i++) {
maps[i] = 0;
}
for (int i = 0; i < str.length(); i++) {
maps[str[i]]++;
}
string res = "";
for (map<char, int>::iterator it = maps.begin(); it != maps.end(); it++) {
res += char(it->second+'0');
}
return res;
}
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res;
map<string, vector<string>> maps;
for (int i = 0; i < strs.size(); i++) {
string str = countChar(strs[i]);
if (maps.find(str) == maps.end()) {
vector<string> arr;
arr.push_back(strs[i]);
maps[str] = arr;
}
else {
maps[str].push_back(strs[i]);
}
}
for (map<string, vector<string>>::iterator it = maps.begin(); it != maps.end(); it++) {
res.push_back(it->second);
}
return res;
}
};
其中countChar()方法用于对字符串计数并返回编码,但该算法复杂度较高,暂时还未细究原因:

最后是原题链接:49.字母异位词分组