LeetCode 49 同字符词语分组 (java)

    xiaoxiao2023-11-08  160

    一、题目分析

    和前面的两个题一样,这道题也采用hashmap来做

    有两种实现的方法,一个是,对数组的每一个字符串元素排序,排序后结果一样的分为一组,也就是说key是排序后的字符串,比如"aet"

    第二种方法是统计每个字符串中的每个字符出现的个数,分为同一组的字符串每个字符出现的次数是相同的,也就是key应该记录26个字母(小写)每一个字母出现的个数 

    二、java代码

    第一种方法:

    class Solution { 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>> groupAnagrams(String[] strs) { if (strs.length == 0) { return Collections.emptyList(); } Map<String, List> ans = new HashMap<String, List>(); int[] count = new int[26];//统计26个字符出现的个数 for (String s : strs) { Arrays.fill(count, 0); for (char c : s.toCharArray()) { count[c - 'a']++;//数组中字符本来就是用ASCII码值存储的 } StringBuilder sb = new StringBuilder(""); for (int i = 0; i < 26; i++) { sb.append('#');//用特殊符号隔开是怕出现超过9的个数,便于区分 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()); } }

    一个小小的知识点:

    就是字符怎么转换为ASCII码值

    数组中字符的存储本来就是按照ASCII码值存储的,所以计算字符下标的时候,需要减去字符a的ASCII码值,因为我们是设置的长度为26的数组

    'a'就可以表示字符a的ASCII码值 

     

    最新回复(0)