每日一題——字母異位詞分組

菜雞每日一題系列打卡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)。

執行結果

學習 | 工作 | 分享

????長按關注“有理想的菜雞

只有你想不到,沒有你學不到

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