中午没有回宿舍午休,每次回去都没睡着,我想就没有必要回去了。京东买的书今天还没到,提前把题做了好专心做开发任务。
1、题目描述
2、逻辑分析
我看了几分钟,有点理解不了这道题需求是什么。看看题解。看了才理解题目的意思。字母异位词:两个字符串互为字母异位词,当且仅当两个字符串包含的字母相同。
解题步骤:同一组字母异位词中的字符串具备相同点,可以使用相同点作为一组字母异位词的标志,使用哈希表存储每一组字母异位词,哈希表的键为一组字母异位词的标志,哈希表的值为一组字母异位词列表。
3、代码演示
public List<List<String>> groupAnagrams(String[] strs) {
// 创建一个HashMap,用于存储字母异位词(anagrams)的分组
// 键是排序后的字符串(代表一种字母组合),值是该组合对应的所有原始字符串列表
Map<String, List<String>> map = new HashMap<>();
// 遍历输入的字符串数组
for(String str: strs){
// 将当前字符串转换为字符数组
char[] arr = str.toCharArray();
// 对字符数组进行排序,以消除字符的顺序差异
Arrays.sort(arr);
// 将排序后的字符数组转换回字符串,作为HashMap的键
String key = new String(arr);
// 从HashMap中获取与当前键关联的列表(如果不存在则返回一个空列表)
List<String> list = map.getOrDefault(key, new ArrayList<String>());
// 将当前原始字符串添加到列表中
list.add(str);
// 将更新后的列表重新放回HashMap中
map.put(key, list);
}
// 将HashMap中所有的值(即所有的字符串列表)转换为一个新的ArrayList并返回
// 这样就得到了按字母异位词分组的结果
return new ArrayList<List<String>>(map.values());
}
我将在IDE中运行代码放过来,可以打断点来一步步看怎么计算的。
package LeetCode;
import java.util.*;
public class groupAnagrams {
public static void main(String[] args) {
String[] strs = {"eat","tea","tan","ate","nat","bat"};
List<List<String>> result = groupAnagrams(strs);
for (List<String> value : result) {
System.out.println(value);
}
}
public static List<List<String>> groupAnagrams(String[] strs) {
// 创建一个HashMap,用于存储字母异位词(anagrams)的分组
// 键是排序后的字符串(代表一种字母组合),值是该组合对应的所有原始字符串列表
Map<String, List<String>> map = new HashMap<>();
// 遍历输入的字符串数组
for(String str: strs){
// 将当前字符串转换为字符数组
char[] arr = str.toCharArray();
// 对字符数组进行排序,以消除字符的顺序差异
Arrays.sort(arr);
// 将排序后的字符数组转换回字符串,作为HashMap的键
String key = new String(arr);
// 从HashMap中获取与当前键关联的列表(如果不存在则返回一个空列表)
List<String> list = map.getOrDefault(key, new ArrayList<String>());
// 将当前原始字符串添加到列表中
list.add(str);
// 将更新后的列表重新放回HashMap中
map.put(key, list);
}
// 将HashMap中所有的值(即所有的字符串列表)转换为一个新的ArrayList并返回
// 这样就得到了按字母异位词分组的结果
return new ArrayList<List<String>>(map.values());
}
}
ok,第二种方法就不看啦,做其他事情去咯,再见!