• LeetCode第[49]题(Java):Group Anagrams


    题目:同字符分组

    难度:Medium

    题目内容

    Given an array of strings, group anagrams together.

    翻译:给定一组字符串数组,按相同字符组成的字符串分为一组。

    Example:

    Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
    Output:
    [
      ["ate","eat","tea"],
      ["nat","tan"],
      ["bat"]
    ]

    我的思路:因为要分组,那么使用map即可,相同的字符作为键,值为一个List作为对应分组

    1、首先遍历,每次将当前字符串打断成char数组,然后sort,判断map中是否包含此sort后的char

    2、是的话则将此字符串add进此key对应的值(List)里面

      否则往map里put一个新的键值对

    我的代码

     1     public List<List<String>> groupAnagrams(String[] strs) {
     2         if (strs == null || strs.length == 0) return new ArrayList<List<String>>();
     3         Map<String, List<String>> map = new HashMap<String, List<String>>();
     4         for (String s : strs) {
     5             char[] ca = s.toCharArray();
     6             Arrays.sort(ca);
     7             String keyStr = String.valueOf(ca);
     8             if (!map.containsKey(keyStr)) map.put(keyStr, new ArrayList<String>());
     9             map.get(keyStr).add(s);
    10         }
    11         return new ArrayList<List<String>>(map.values());
    12     }

    我的复杂度:O(N*K*logK)  ———k为最长的字符串长度,sort方法为klogk

    编码过程中的问题

    1、一开始使用的键为char[],后来发现数组的equals方法使用的是最原始的比较地址,并不会比较其中的内容,所以改成了String就好了;

    2、将map转为List只需要调用map.values()方法就会返回一个包含所有元素的Collection,然后用其子类的构造方法接住都行。

    答案代码

     1     public List<List<String>> groupAnagrams(String[] strs) {
     2         if (strs.length == 0) return new ArrayList();
     3         Map<String, List> ans = new HashMap<String, List>();
     4         int[] count = new int[26];
     5         for (String s : strs) {
     6             Arrays.fill(count, 0);
     7             for (char c : s.toCharArray()) count[c - 'a']++;
     8             
     9             StringBuilder sb = new StringBuilder("");
    10             for (int i = 0; i < 26; i++) {
    11                 sb.append(count[i]);
    12             }
    13             String key = sb.toString();
    14             if (!ans.containsKey(key)) ans.put(key, new ArrayList());
    15             ans.get(key).add(s);
    16         }
    17         return new ArrayList(ans.values());
    18     }

    答案复杂度:O(N*K)

    答案思路

    1、和我的方法一样对String数组进行循环;

    2、然后没有使用排序,而是做了一个只包含26个元素的数组,直接记录26个字母各有多少个

    3、将这26个int,按顺序取出并拼接成一个字符串,这样也能表示使用相同字母的字符串的key

    4、map没有则用此key,put一个List(有则不需要操作)。然后对应key的List直接add进当前String。

  • 相关阅读:
    Java Properties 类读配置文件保持顺序
    mysql在增加列前进行判断该列是否存在
    java中用jdom创建xml文档/将数据写入XML中
    JavaFX 简介
    ActiveMQ详细入门使用教程
    Jquery Pagination分页插件使用
    Jquery选择器总结
    自己4月份面试的一些总结
    Java面试题全集(下)转载
    Java面试题全集(上)转载
  • 原文地址:https://www.cnblogs.com/Xieyang-blog/p/9026844.html
Copyright © 2020-2023  润新知