• 49. Group Anagrams


    一、题目

      1、审题

      

      2、分析:

        给出一个字符串数组,将其中字符串中所含字母相同仅仅顺序不同的字符串归为一类,记录所有分类。

    二、解答

      1、思路:

        方法一、利用 Java 封装的方法进行实现:

            ①、将字符串元素转为字符数组,进行排序,后重新转为有序的字符串;

            ②、新建一个 Map<String, List<String>>,用于存放分类,其中 Key 为 排序后的字符串,List 存放原字符串;

            ③、最终将②的 Map 的 ValueSet 返回即可。

    public List<List<String>> groupAnagrams(String[] strs) {
            
            List<List<String>> resultList = new ArrayList<List<String>>();
            
            if(strs == null || strs.length == 0)
                return    resultList;
            
            int len = strs.length;
            char[][] chars = new char[len][];
            
            Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
            for (int i = 0; i < strs.length; i++) {  
                chars[i] = strs[i].toCharArray();    // 字符排序
                Arrays.sort(chars[i]);
                String sortedString = String.valueOf(chars[i]);
    
                if(map.containsKey(sortedString)) {    // 存入 Map
                    map.get(sortedString).add(strs[i]);
                }
                else {
                    ArrayList<String> list = new ArrayList<String>();
                    list.add(strs[i]);
                    map.put(sortedString, list);
                }
            }
            
            for(ArrayList<String> list: map.values()) {  // 放入 集合
                Collections.sort(list);
                resultList.add(list);
            }
            
            return resultList;
        }

      简化版:

      

    public List<List<String>> groupAnagrams(String[] strs) {
            
            Map<String, List<String>> map = new HashMap<String, List<String>>();
            if(strs == null || strs.length < 1)
                return null;
            
            for(String str: strs) {
                
                // sort the str
                char[] cArray = str.toCharArray();
                Arrays.sort(cArray);
                String sortedStr = String.valueOf(cArray);
                
                // put str into the map
                if(!map.containsKey(sortedStr)) {
                    map.put(sortedStr, new ArrayList<String>());
                }
                map.get(sortedStr).add(str);
            }
            
            // sort the list
            return new ArrayList<List<String>>(map.values());
        }

      方法二:利用素数相乘来作为唯一可以确定的 Key ,免去了排序。

    class Solution {
        public List<List<String>> groupAnagrams(String[] strs) {
            int[] prime = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 
                                59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103};//最多10609个z
            
            List<List<String>> resultList = new ArrayList<List<String>>();    // 
            
            // key = 唯一键值, value = resultList 中的 Key 的下标;
            HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();    
            
            for (String s : strs) {
                int key = 1;
                for (char c : s.toCharArray()) {// 获得唯一Key
                    key *= prime[c - 'a'];
                }
                
                List<String> targetList;
                if (map.containsKey(key)) {
                    targetList = resultList.get(map.get(key));
                } else {
                    targetList = new ArrayList<String>();
                    resultList.add(targetList);
                    map.put(key, resultList.size() - 1);
                }
                targetList.add(s);
            }
            return resultList;
        }
    }

        

  • 相关阅读:
    Zabbix 管理界面中文出现乱码解决方法
    zabbix应用监控实践
    linux系统基础优化
    linux下创建软链--laravel软链
    php使用webservice调用C#服务端/调用PHP服务端
    php+ajax远程加载避免重复提交
    date
    函数类型
    DOM及其扩展
    字符串的截取方法
  • 原文地址:https://www.cnblogs.com/skillking/p/9635041.html
Copyright © 2020-2023  润新知