题目
给你一个字符串数组,请你将 字母异位词
组合在一起。可以按任意顺序返回结果列表。
字母异位词
是由重新排列源单词的所有字母得到的一个新单词。
示例 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]
仅包含小写字母
题解
思路其实还是比较清晰的:
理所当然我们需要判断哪些单词是字母异位词?其实是统计字母出现次数相同,但是这里我们使用排序的方法,排序后相同的单词一定是字母异位词。
那么接下来只需要遍历strs
数组,然后对每个单词都进行排序,使用一个map
保存排序后的string
-在res
里的下标,判断排序后的单词是否是新单词(不是之前某个单词的字母异位词),新单词我们就做新的插入操作;否则就放到相应的字母异位词里去就可以了。时间复杂度97.86%嘿嘿(●ˇ∀ˇ●)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public List<List<String>> groupAnagrams(String[] strs) { List<List<String>> res = new ArrayList<>(); HashMap<String, Integer> map = new HashMap<>();
for (int i = 0; i < strs.length; i++) { char[] charArray = strs[i].toCharArray(); Arrays.sort(charArray); String stringSort = new String(charArray);
if (map.get(stringSort) != null) { res.get(map.get(stringSort)).add(strs[i]); } else { map.put(stringSort, res.size()); List<String> listTemp = new ArrayList<>(); listTemp.add(strs[i]); res.add(listTemp); } }
return res; } }
|