每日一题——字母异位词分组

菜鸡每日一题系列打卡49

每天一道算法题目 

小伙伴们一起留言打卡

坚持就是胜利,我们一起努力!

题目描述(引自LeetCode)

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

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

说明:

  • 所有输入均为小写字母。

  • 不考虑答案输出的顺序。

题目分析

这是一道字符串的相关题目,题目给出了字母异位词的定义,比较容易想到的思路是,对字符串的字符按照某一顺序(比如字典序)进行排序,然后比较是否相等。但排序的时间复杂度为O(nlogn),而题目又限定输入仅为小写字母,因此,可以考虑采用哈希映射来进行比较。

本文将按照后一种思路进行实现,值得注意的是,在单线程情况下进行大量字符串拼接操作时,使用StringBuilder类效率会更高。话不多说,上代码!

代码实现

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs == null || strs.length == 0) return new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();
        for (String str : strs) {
            int[] tmp = new int[26];
            for (char c : str.toCharArray()) tmp[c - 'a']++;
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < 26; i++) builder.append(tmp[i]);
            String key = builder.toString();
            if (!map.containsKey(key)) map.put(key, new ArrayList<>());
            map.get(key).add(str);
        }
        return new ArrayList(map.values());
    }
}

代码分析

对代码进行分析,不妨设strs[]数组的长度为m,设strs[]数组中长度最大的str字符串长度为n,则时间复杂度为O(mn),而就空间而言,需要用额外的哈希表进行存储,因此,空间复杂度也为O(mn)。

执行结果

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章