第三章哈希表_字母异位词分组

今天体侧,1000m,还好,前几天都是几度晚上甚至跌破了零度,今天下午十几度,还是非常的适合跑步的。但是依然是要了老命,最后小组第三,还行吧。

然后最近不就是在写哈希表的题嘛,然后就发现了这道题。咋一看,真的很简单,但是吧,我确实在中途卡住了,┭┮﹏┭┮,ok请看VCR

吾日三省吾身

比那个男人帅吗?

比那个男人爱她吗?

比那个男人有实力吗?


力扣题号:49. 字母异位词分组 - 力扣(LeetCode)

下述题目描述和示例均来自力扣

题目描述

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

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


 示例

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]

输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]

输出: [[""]]

示例 3:

输入: strs = ["a"]

输出: [["a"]]

思路,这道题其实一眼能看出来可以用哈希表,因为又要找东西了是吧

然后我们在看,将字母异位词组合在一起,然后按任意顺序返回结果列表。

Java解法之一:我反手就是一个排序

什么排序?干啥排序,其实这里的排序就是把这里给的字符数组中的单词,按a-z的顺序重新排列一下,然后如果这个是字母异位词,那么排序完毕之后他们的单词就是一样一样的了

按照这个思路可以写出如下的代码:

        //利用排序的方法
        //定义一个map集合用于存储str和他的原始值(也就是原始单词)
        //因为一个key可能对应多个不同的字母异位词,所以用一个链表来存储它
        Map> map = new HashMap<>();
        for (String str : strs) {
            //这里先将它转化为字符数组,这样好使用数组的API将它排序
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            str = chars.toString();
            //将原有的list取出来
            List list = map.getOrDefault(str, new ArrayList<>());
            //存入list
            list.add(str);
            //存入map
            map.put(str,list);
        }
        return new ArrayList>(map.values());
    }
}

然后直接   启动~!!!!!!!!!!

第三章哈希表_字母异位词分组_第1张图片

斯~~

错啦????!!!!!

为什么呢?我的代码已经天衣无缝了啊。存成地址了,为什么呢?

然后我挨个加上了泛型,测了这个测了那个发现。呃(⊙o⊙)…

第三章哈希表_字母异位词分组_第2张图片

发现,如果用char.tostring的话返回的是地址,数组是不能这样转换成字符串的,只能说java学多了,后面有好用的工具让我都忘记了这些基础的知识,即使是使用Arrays.toString()也不行,因为这是打印字符数组而不是将它转换成字符串。又学到了吧。

那么修改一下我们的代码就变成了这样。

class Solution {
    public List> groupAnagrams(String[] strs) {
        //利用排序的方法
        //定义一个map集合用于存储str和他的原始值(也就是原始单词)
        //因为一个key可能对应多个不同的字母异位词,所以用一个链表来存储它
        Map> map = new HashMap<>();
        for (String str : strs) {
            //这里先将它转化为字符数组,这样好使用数组的API将它排序
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            //新创建一个string对象就行
            String mapKey = new String(chars);
            //将原有的list取出来
            List list = map.getOrDefault(mapKey, new ArrayList<>());
            //存入list
            list.add(str);
            //存入map
            map.put(mapKey,list);
        }
        return new ArrayList<>(map.values());
    }
}

过了!!!!!!!!!!!!

第三章哈希表_字母异位词分组_第3张图片


Java解法二:我正手就是一个记数

这个方法我说实话我没有想到,我是看见了力扣的题解,毕竟上面的方法只超过了81%的人。

class Solution {
public List> groupAnagrams(String[] strs) {
        Map> map = new HashMap>();
        for (String str : strs) {
            int[] counts = new int[26];
            int length = str.length();
            for (int i = 0; i < length; i++) {
                counts[str.charAt(i) - 'a']++;
            }
            // 将每个出现次数大于 0 的字母和出现次数按顺序拼接成字符串,作为哈希表的键
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < 26; i++) {
                if (counts[i] != 0) {
                    sb.append((char) ('a' + i));
                    sb.append(counts[i]);
                }
            }
            String key = sb.toString();
            List list = map.getOrDefault(key, new ArrayList());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList>(map.values());
    }
}

第三章哈希表_字母异位词分组_第4张图片

呃没想到吧。我也没想到,而且知道写完这篇文章我都仍然没有充分的理解这种解法。作罢,先留在这里以后回过头来在研究吧。


结语:

最后自以为是的更强的方法还是不理解,甚至会更慢

我的意思是:你以为的命中注定,或许只是你以为

你可能感兴趣的:(我的算法记录,散列表,数据结构,算法,java,哈希算法)