LeetCode 49 – 字母异位词分组

题目描述

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

示例 1:

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

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

解释:

在 strs 中没有字符串可以通过重新排列来形成 "bat"。
字符串 "nat" 和 "tan" 是字母异位词,因为它们可以重新排列以形成彼此。
字符串 "ate" ,"eat" 和 "tea" 是字母异位词,因为它们可以重新排列以形成彼此

题目分析

使用哈希表对字符串进行分组,重点是哈希算法的实现
– 字符串内从小到大排序:时间复杂度 O(n*k*log(k))
– 字符串26个字母分别计数:时间复杂度O(n*k)

n 是字符串个数,k是单个字符串长度

Java

public List<List<String>> groupAnagrams(String[] strs) {
    HashMap<String, List<String>> map = new HashMap<>();
    for (String str : strs) {
        String key = hash(str);
        if (map.get(key) == null) {
            map.put(key, new ArrayList<>());
        }
        List<String> list = map.get(key);
        list.add(str);
    }
    return map.values().stream().toList();
}

//    private String hash(String str) {
//        char[] array = str.toCharArray();
//        Arrays.sort(array);
//        return Arrays.toString(array);
//    }

private String hash(String str) {
    StringBuilder builder = new StringBuilder();
    int[] num = new int[26];
    for (int i = 0; i < str.length(); i++) {
        num[str.charAt(i) - 'a']++;
    }
    for (char ch = 'a'; ch <= 'z'; ch++) {
        int index = ch - 'a';
        if (num[index] > 0) {
            builder.append(ch);
            builder.append(num[index]);
        }
    }
    return builder.toString();
}

Kotlin

    fun groupAnagrams(strs: Array<String>): List<List<String>> {
        val map = HashMap<String, ArrayList<String>>()
        for (str in strs) {
            val key = hash(str)
            if (map[key] == null) {
                map[key] = ArrayList()
            }
            map[key]?.add(str)
        }
        return map.values.toList()
    }

//    fun hash(str: String): String {
//        val array = str.toCharArray()
//        Arrays.sort(array)
//        return Arrays.toString(array)
//    }

    fun hash(str: String): String {
        val builder = StringBuilder()
        val num = IntArray(26)
        for (ch in str) {
            num[ch - 'a']++
        }
        for (i in 0 until 26) {
            if (num[i] > 0) {
                builder.append('a' + i)
                builder.append(num[i])
            }
        }
        return builder.toString()
    }

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部