zoukankan      html  css  js  c++  java
  • 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;
        }
    }

        

  • 相关阅读:
    php分页类 (来源网络)
    symfony2 symofny3中得到get post session cookies的方法
    symfony route参数
    Symfony2同步数据库的数据表
    mysql中SQL执行过程详解与用于预处理语句的SQL语法
    使用MySQL命令行新建用户并授予权限的方法
    抽象类和接口的区别
    Yaf 使用遇到的坑
    Mysql 常用引擎的特点及选择使用策略
    定时任务 Crontab命令 详解
  • 原文地址:https://www.cnblogs.com/skillking/p/9635041.html
Copyright © 2011-2022 走看看