题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
- 字母异位词是由重新排列源单词的所有字母得到的一个新单词。
思路
同一个字母异位词之间的联系:
如
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;
}
}