49. 字母异位词分组(力扣)

题目

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

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例 1:

输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
示例 2:

输入: strs = [“”]
输出: [[“”]]
示例 3:

输入: strs = [“a”]
输出: [[“a”]]

解法

思路:

异位词中的字母都是一样的,所以能不能转换成顺序一样的字符串,转换之后,对应在HashMap中的索引值就一样(即key的值一样),那么就只需要在对应key的value值上加上一个集合,每次key值一样,就在value值后面加上对应的异位词字符串就可以了,对应的思路,可以有很多的解法

解法
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {

        HashMap <String,List<String>> hash = new HashMap<>();

        for(String str: strs){
            //获取每一个字符串的编码值
            String code = codeOfString(str);

            //如果HashMap中有这个code,就取出对应的value(即List),在后面加上当前的str
            if(hash.containsKey(code)){
                hash.get(code).add(str);
            }else{
                //没有这个code就在hash中新建对应的键和值
                LinkedList <String> list =  new LinkedList<>();
                list.add(str);
                hash.put(code,list);
            }
        }

        //把hash 的值全部取出来(每个值都是一个集合)放在List中
        List<List<String>>  res = new ArrayList<>();
        for(List<String>list : hash.values()){
            res.add(list);
        }
        return  res;

    }
    //给一个编码值,编码值相等的字符串,说明是字母异位,返回的code都是一样的
    public String codeOfString(String a){
        int buf[] =  new int[26]; 
        for(char c : a.toCharArray()){
            buf[c-'a']+=1;
        }
        return Arrays.toString(buf);
    } 

}
   //解法2、直接对字符串进行操作
     public List<List<String>> groupAnagrams(String[] strs) {
         HashMap <String,List<String>> hash = new HashMap<>();
         for(String str : strs ){
             char []chars = str.toCharArray();//转换为字符数组
             Arrays.sort(chars); //对字符数组排序

             String order = new String(chars);//转化为有序字符串
            //如果HashMap中有这个code,就取出对应的value(即List),在后面加上当前的str
             if(hash.containsKey(order)){
                hash.get(order).add(str);
            }else{
                //没有这个code就在hash中新建对应的键和值
                LinkedList <String> list =  new LinkedList<>();
                list.add(str);
                hash.put(order,list);
            }
         }
         return new ArrayList<List<String>>(hash.values());
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值