1. 程式人生 > >Leetcode演算法Java全解答--49. 字母異位詞分組

Leetcode演算法Java全解答--49. 字母異位詞分組

Leetcode演算法Java全解答–49. 字母異位詞分組

文章目錄

題目

給定一個字串陣列,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字串。

說明:

所有輸入均為小寫字母。
不考慮答案輸出的順序。

示例


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

想法

用一個hashMap<String, List>來儲存出現的單詞

key是單詞進行排序之後的資料(比如eat、tea、ate,這些的key都是aet)

value是陣列

結果

超過97%的測試案例

時間複雜度/空間複雜度:n/n

總結

// TODO

程式碼

我的答案

public List<List<String>> groupAnagrams(String[] strs) {
    if (strs.length == 0) {
        return Collections.emptyList();
    }
    
    Map<String, List<String>> ans = new HashMap<>();
    for (String str : strs) {
        char[] chars = str.toCharArray();
        Arrays.sort(chars);
        String key = String.valueOf(chars);
        if (!ans.containsKey(key)) {
            ans.put(key, new ArrayList<String>());
        }
        ans.get(key).add(str);
    }
    
    return new ArrayList(ans.values());
}

大佬們的答案

class Solution {
    public List<List<String>> better(String[] strs) {
        if (strs.length == 0) {
            return Collections.emptyList();
        }
        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());
    }
}

測試用例

@Test
public void test049() {
    // 建立測試案例
    String[] arr1 = new String[] { "eat", "tea", "tan", "ate", "nat", "bat" };

    // 測試案例期望值
    List<List<String>> expResult1 = new ArrayList<>();
    List<String> list1 = new ArrayList<>();
    list1.add("ate");
    list1.add("eat");
    list1.add("tea");
    List<String> list2 = new ArrayList<>();
    list2.add("nat");
    list2.add("tan");
    List<String> list3 = new ArrayList<>();
    list3.add("bat");
    expResult1.add(list1);
    expResult1.add(list2);
    expResult1.add(list3);

    // 執行方法
    Solution049 solution049 = new Solution049();
    List<List<String>> result1 = solution049.groupAnagrams(arr1);

    // 判斷期望值與實際值
    Assert.assertEquals(expResult1, result1);

}

其他

程式碼託管碼雲地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git

檢視其他內容可以點選專欄或者我的部落格哈:https://blog.csdn.net/cmqwan

“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改

如有疑問請聯絡,聯絡方式:QQ3060507060