题目

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

1
2
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

1
2
输入: strs = [""]
输出: [[""]]

示例 3:

1
2
输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use std::collections::HashMap;

impl Solution {
pub fn group_anagrams(strs: Vec<String>) -> Vec<Vec<String>> {
let mut anagrams_map: HashMap<Vec<char>, Vec<String>> = HashMap::new();

for str in strs {
let mut char_vec: Vec<char> = str.chars().collect();
char_vec.sort();

let entry = anagrams_map.entry(char_vec)
.or_insert(vec![]);

entry.push(str);
}
anagrams_map.into_values().collect()
}
}

说明

  1. use std::collections::HashMap;: 这是引入 Rust 标准库中的 HashMap 数据结构,它允许你使用键值对的方式存储和检索数据。

  2. let mut anagrams_map: HashMap<Vec<char>, Vec<String>> = HashMap::new();: 这行代码创建了一个可变的 HashMap,其中键是经过排序的字符数组,而值是原始字符串的向量。HashMap::new() 创建了一个新的 HashMap 实例。

  3. for s in strs { ... }: 这是一个迭代循环,遍历输入的字符串数组 strs 中的每个字符串。在每次迭代中,当前字符串被绑定到变量 s 上。

  4. let mut char_vec: Vec<char> = s.chars().collect();: 这一行创建了一个可变的字符向量 char_vec,它由当前字符串 s 的字符组成。s.chars() 返回一个字符迭代器,而 .collect() 将迭代器的元素收集到一个新的集合中,这里是一个字符向量。

  5. char_vec.sort();: 这是对字符向量进行排序的操作。因为我们希望找到字母异位词,所以排序后的字符向量将相同的字母组合在一起,从而使它们在哈希表中形成相同的键。

  6. let entry = anagrams_map.entry(char_vec).or_insert(vec![]);: 这一行使用 entry 方法来获取哈希表中指定键 char_vec 对应的值,如果该键不存在,则插入一个空的向量作为默认值。这是为了确保每个键都有一个关联的向量用于存储字母异位词。

  7. entry.push(s);: 这一行将原始字符串 s 添加到对应的值中,即与排序后的字符数组关联的向量中。

  8. anagrams_map.into_values().collect(): 这一行通过 into_values() 方法将哈希表中所有的值取出,并通过 collect() 方法将它们收集到一个新的向量中。最终,这个向量包含了所有的字母异位词分组。

这样,整个实现就完成了字母异位词分组的操作。