题目描述
给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
解题思路
这是一个字符串分组问题,可以使用哈希表和排序来解决。
具体来说,我们可以遍历每个字符串,将字符串中的字符按照字母顺序排序,然后将排序后的字符串作为键,原字符串作为值,存储到哈希表中。这样,具有相同排序后的字符串的原始字符串就会被分组到同一个列表中。最后,将字典中的所有值作为结果返回。
代码实现
根据上述思路,我们分别使用python和C++两种语言进行代码实现
Python实现
由于python自带的字典就是哈希表这种数据结构,我们可以初始化一个字典用来存储排序后的字符串和原字符串,键值对应关系如上述所示。
枚举列表中的字符串,利用sorted()
函数进行排序并使用join()
函数加入到字符串中,用key
变量来存储键,如果在哈希表中可以查询到该键就将原字符串添加到哈希表中,否则就初始化键值对。
最后以列表形式返回哈希表中的所有值。
代码如下:
def groupAnagrams(strs):
groups = dict()
for s in strs:
key = ''.join(sorted(s))
if key in groups:
groups[key].append(s)
else:
groups[key] = [s]
return list(groups. Values())
# test
if __name__ == '__main__':
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
print(groupAnagrams(strs))
C++实现
首先使用unordered_map
类型的哈希表m
存储排序后的字符串和原字符串之间的映射关系。
对于字符串列表中的每个字符串,将其复制到变量t
中,然后使用sort()
函数对t
中的字符进行排序,从而得到一个排好序的字符串。将原字符串s
添加到哈希表m
中,键为t
,值为s
遍历哈希表m
,将每个键对应的值(即原字符串)存储到一个新的二维向量ans
中。最后返回二维向量ans
,其中每个子向量都是按字母异位词分组后的字符串列表。
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string> strs) {
unordered_map<string, vector<string>> m;
for (string s : strs) {
string t = s;
sort(t.begin(), t.end());
m[t].push_back(s);
}
vector<vector<string>> ans;
for (auto p : m) {
ans.push_back(p.second);
}
return ans;
}
};
// test
int main() {
Solution s;
vector<string> strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
vector<vector<string>> ans = s.groupAnagrams(strs);
for (auto v : ans) {
for (string s : v) {
cout << s << " ";
}
cout << endl;
}
return 0;
}
总结
本题是一个字符串分组问题,可以使用哈希表和排序来解决。我们分别使用python和C++解决这个问题,python中使用字典来存储键值对,C++中使用unordered_map
类型的哈希表来存储键值对。