字母异位分组-考察哈希表

题目

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

  • 字母异位词是由重新排列源单词的所有字母得到的一个新单词。

在这里插入图片描述

思路

同一个字母异位词之间的联系:
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;
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值