字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
0 <= strs[i].length <= 100strs[i]仅包含小写字母
思路分析
两个字符串互为字母异位词,当且仅当两个字符串包含的字母相同。同一组字母异位词中的字符串具备相同点,可以使用相同点作为一组字母异位词的标志,使用哈希表存储每一组字母异位词,哈希表的键为一组字母异位词的标志,哈希表的值为一组字母异位词列表。
比较字符串是否相同,可以先将字符串排序:先用 char[] ch=s.toCharArray(); 转成字符数组,再用 Arrays.sort(ch); 进行排序。最后用键来判断是否有这个键,如果有就相同。
放在一起,可以用map.put(key,new ArrayList<>()); 构建一个集合 ,再用map.get(key).add(s);将需要放在一起的放进集合
需要找到的是由相同字母组成的单词 那这样的单词经过排序之后都是一样的字母,可以形成一个标识即为key 用HashMap存储key,value为相同字母单词的list 最后输出map里所有的value就是要的结果
需要了解一下java中map和list的特性 map是一个key对应一个value,不重复 list可以重复,所以就算有重复的单词也没事
算法代码
public List < List < String >> groupAnagrams(String[] strs) {
HashMap < String, List < String >> map = new HashMap < String, List < String >> ();
for (String str: strs) {
char[] strCh = str.toCharArray();
Arrays.sort(strCh);
String key = new String(strCh);
List < String > list = map.getOrDefault(key, new ArrayList < String > ());
list.add(str);
map.put(key, list);
}
return new ArrayList < List < String >> (map.values());
}
结果详情
算法复杂度
- 空间复杂度:
- 时间复杂度:
在掘金(JUEJIN)一起进步,一起成长!