菜雞每日一題系列打卡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)。
執行結果
學習 | 工作 | 分享
????長按關注“有理想的菜雞”
只有你想不到,沒有你學不到