Leetcode刷题经验

Java学习笔记

  • Leetcode刷题经验
    • 热题HOT100
      • 49、字母异位词分组

Leetcode刷题经验

热题HOT100

49、字母异位词分组

该题可以借用 H a s h M a p HashMap HashMap 的方式对字符串数组中的每一个字符串进行哈希映射,在保证每一个字符串的字符出现次数相等即可。
解题思路:

这里直接借鉴官方提供的思路与算法:

  • 我们可以将每个字符串 s s s 转换为字符数 c o u n t count count,由26个非负整数组成,表示 a a a b b b c c c 的数量等。我们使用这些计数作为哈希映射的基础。
  • 在 Java 中,我们的字符数 c o u n t count count 的散列化表示将是一个用 字符分隔的字符串。 例如, a b b c c c abbccc abbccc 将表示为 # 1 # 2 # 3 # 0 # 0 # 0... # 0 #1#2#3#0#0#0 ...#0 123000...0,其中总共有 26 26 26 个条目。

Leetcode刷题经验_第1张图片

时间复杂度: O ( N K ) O(NK) O(NK),其中 N N N s t r s strs strs 的长度,而 K K K s t r s strs strs 中字符串的最大长度。计算每个字符串的字符串大小是线性的,我们统计每个字符串;空间复杂度: O ( N K ) O(NK) O(NK),排序存储在 a n s ans ans 中的全部信息内容。

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs.length == 0) return new ArrayList();
        Map<String, List> ans = new HashMap<String, List>();
        int[] count = new int[26];
        for (String s : strs) {
            Arrays.fill(count, 0);
            for (char c : s.toCharArray()) count[c - 'a']++;

            StringBuilder sb = new StringBuilder("");
            for (int i = 0; i < 26; i++) {
                sb.append('#');
                sb.append(count[i]);
            }
            String key = sb.toString();
            if (!ans.containsKey(key)) ans.put(key, new ArrayList());
            ans.get(key).add(s);
        }
        return new ArrayList(ans.values());
    }
}

欢迎大家交流,一起进步!
在这里插入图片描述

你可能感兴趣的:(数据结构与算法,java)