玩转lee49字母异位词分组。

17 篇文章 0 订阅
14 篇文章 0 订阅

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。

思路 hashmap

本质要想清楚hashmap中 键和值都存的是什么

思路:利用HashMap 键为排序后相等的异位词 值为List 里面装的是所有排序后相等的异或词集合

分为两种情况
如果没有 就新建一个arraylist数组,再add
如果有的话直接add
所以最后都要add就放到if外面

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        //返回值是List ,List里面是List 装的String  定义一个HashMap 值为List
        Map<String,List> map = new HashMap<String,List>();
        for(String i:strs){
            char[] arr=i.toCharArray(); //将字符串转换成数组
            Arrays.sort(arr);          //将字符数组排序
            String str=String.valueOf(arr);//将字符串数组变回字符串
            if(!map.containsKey(str)){
                map.put(str,new ArrayList()); //若不存在建立映射关系 排序后的字符串—>新的List集合(装未排序的异位词)
            }
            map.get(str).add(i);//建立映射关系户后添加 以及存在映射关系后添加 单词
        }
        return new ArrayList(map.values());//返回值是List集合 通过构造器 构造一个包含指定 collection 的元素的列表
    }
}
  1. char[] arr=i.toCharArray(); //将字符串转换成数组
  2. String str=String.valueOf(arr);//将字符串数组变回字符串
  3. return new ArrayList(map.values());
    map.values() 是map中所有value的集合

看到的答案 质数

在美版leetcode上看到大神的思路,用质数表示26个字母,把字符串的各个字母相乘,这样可保证字母异位词的乘积必定是相等的。其余步骤就是用map存储,和别人的一致了。(这个用质数表示真的很骚啊!!!)

map<Integer, List>
前面Integer是每个字符串所有字母的质数之积
List中是异位词
注:static块
map前面必须有static标注

class Solution {
    private static Map<Character,Integer> table = new HashMap<>();
    static{
        table.put('a', 2);
        table.put('b', 3);
        table.put('c', 5);
        table.put('d', 7);
        table.put('e', 11);
        table.put('f', 13);
        table.put('g', 17);
        table.put('h', 19);
        table.put('i', 23);
        table.put('j', 29);
        table.put('k', 31);
        table.put('l', 37);
        table.put('m', 41);
        table.put('n', 43);
        table.put('o', 47);
        table.put('p', 53);
        table.put('q', 59);
        table.put('r', 61);
        table.put('s', 67);
        table.put('t', 71);
        table.put('u', 73);
        table.put('v', 79);
        table.put('w', 83);
        table.put('x', 89);
        table.put('y', 97);
        table.put('z', 101);

    }
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<Integer,List<String>> map=new HashMap<>();
        for(String str :strs){
            int key=1;
            for(int i=0;i<str.length();i++){
                key *= table.get(str.charAt(i));
            }

            if(!map.containsKey(key)){
                List<String> list=new ArrayList<>();
                list.add(str);
                map.put(key,list);
            }
            else
                map.get(key).add(str);
        }
        return new ArrayList<>(map.values());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值