题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
- 字母异位词是由重新排列源单词的所有字母得到的一个新单词。
思路
同一个字母异位词之间的联系:
如 e a t eat eat、 a t e ate ate能够转变成 a e t aet aet(按字母表序排)
这个可以通过将字符串转成字符数组,并用 A r r a y s . s o r t Arrays.sort Arrays.sort排序成 a e t aet aet
所以可以构建一个 M a p Map Map, k e y key key用于存储 a e t aet aet,即字母异位词之间的联系
v a l u e value value存储啥呢,因为返回的值是 L i s t < L i s t < S t r i n g > > List<List<String>> List<List<String>>;可以联想到 v a l u e value value可以存储同一组的下标,即可转化成 a e t aet aet应该在 L i s t < L i s t < S t r i n g > > List<List<String>> List<List<String>>中的索引位置。
因此:
- 当碰到未出现过的字母异位词,在List中扩充一位。并在 M a p Map Map中存储异位词之间的联系和刚刚扩充的 L i s t List List下标
- 碰到出现过的,先通过联系在 M a p Map Map中获取下标。List.get(下标).add(元素)进行加入
代码
class Solution {public List<List<String>> groupAnagrams(String[] strs) {//key:字母异位词联系;value:存储在List中的下标索引Map <String,Integer> indexOfString = new HashMap<>();//存储答案的链表List<List<String>> res = new ArrayList<>();//遍历每个字符for(String str:strs){char[]c = str.toCharArray();Arrays.sort(c);String temp = new String(c);//temp即字母异位词的联系if(indexOfString.containsKey(temp)){//Map中记录这个异味词的存储下标了res.get(indexOfString.get(temp)).add(str);//获取下标所在链表,加入字符元素}else{//没存储indexOfString.put(temp,res.size());//记录一下这个异位词组联系和应该放的位置List<String> l = new ArrayList<>();//构建存储链表l.add(str);//以后联系为temp的字母异位词都存这个链表里res.add(l);//扩充加到答案中}}return res;}
}