LeetCode(49):字母异位词分组 Group Anagrams(Java)

    xiaoxiao2022-07-14  156

    2019.5.23 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)

    这题还是有点技巧。根本上来说,只需要通过一个哈希表就可以进行分组。技巧在于如何选取哈希表的Key值。有三种方案:

    1.将排序后的字符数组作为Key

    2.统计字母出现次数作为key

    3.用质数表示每一个字母,用字符串字母乘积作为key

    另外在使用过程中需要注意String作为哈希表key值的问题(相同值的String变量哈希码可能不同)

    对于charArray变量,String.valueOf()底层是new String()。

    相同值不同哈希码的charArray变量依次使用Object.toString()之后hashCode()不同,依次使用String.valueOf()之后hashCode()相同。

    对于StringBuildrer变量,String.valueOf()底层是Object.toString(),StringBuildrer重写的toString()底层是new String()。

    相同值不同哈希码的StringBuildrer变量依次使用String.valueOf()/Object.toString()之后hashCode()相同,依次使用toString()之后hashCode()也相同。


    传送门:字母异位词分组

    Given an array of strings, group anagrams together.

    给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

    示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ] 说明: 所有输入均为小写字母。 不考虑答案输出的顺序。
    import java.util.*; /** * * Given an array of strings, group anagrams together. * 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 * */ public class GroupAnagrams { //将排序后的字符数组作为key //相同值不同哈希码的charArray变量依次使用Object.toString()之后hashCode()不同,依次使用String.valueOf()之后hashCode()相同。 public List<List<String>> groupAnagrams(String[] strs) { HashMap<String, ArrayList<String>> map = new HashMap<>(); for(String str : strs){ char[] cs = str.toCharArray(); Arrays.sort(cs); // 不能用String key = cs.toString();,直接在常量池中新建对象。 // String key = String.valueOf(cs);先检查常量池中的对象,没有才新建。 String key = String.valueOf(cs); if(!map.containsKey(key)){ map.put(key, new ArrayList<>()); } map.get(key).add(str); } return new ArrayList(map.values()); } //统计字母出现次数作为key(改进:用质数表示每一个字母,用乘积作为字符串的key) //相同值不同哈希码的StringBuildrer变量依次使用String.valueOf()/Object.toString()之后hashCode()相同,依次使用toString()之后hashCode()也相同。 public List<List<String>> groupAnagrams2(String[] strs){ if(strs.length <= 0){ return new ArrayList<>(); } HashMap<String, ArrayList<String>> map = new HashMap<>(); for(String str : strs){ char[] cs = str.toCharArray(); int[] count = new int[26]; for(char c : cs){ ++count[c - 'a']; } StringBuilder s = new StringBuilder(""); for(int num : count){ s.append(num); } //使用String.valueOf()或者toString()均可。 String key = String.valueOf(s); //String key = s.toString(); if(!map.containsKey(key)){ map.put(key, new ArrayList<>()); } map.get(key).add(str); } return new ArrayList(map.values()); } }

    #Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

    最新回复(0)